簡體   English   中英

將數組從ViewController傳遞到AppDelegate

[英]Pass an array from ViewController to AppDelegate

我在ViewController中設置了一個數組名為浮點值的playingRates。 我想在我的appdelegate中的函數中使用這些值。 我如何從我的appdelegate中訪問這些值?

ViewController.h

@interface P15ViewController : UIViewController <GuitarStringsViewDelegate>
{
    float playbackRates[6];
}

ViewController.m

- (void)viewDidLoad
{

    self.guitarStringView.delegate = self;
    chordNameLabel.text = chordName;
    self.guitarStringView.chordName=chordName;

    if([chordName isEqualToString:@"A"]){
        playbackRates[0] = 1.0;
        playbackRates[1] = 1.0;
        playbackRates[2] = 2 * pow(2, (2/12));
        playbackRates[3] = 2 * pow(2, (2/12));
        playbackRates[4] = 2 * pow(2, (2/12));
        playbackRates[5] = 1.0;
    }
    else if([chordName isEqualToString:@"B"]){
    //set rates
    }
    else if([chordName isEqualToString:@"C"]){
    //set rates
    }
    [super viewDidLoad];

}

appdelegate.h

#import <UIKit/UIKit.h>
#import <PAEEngine/PAEEngine.h>
@interface P15AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

-(void)play:(int)index velocity:(float)velocity;

@end

appdelegate.m-需要通過play方法中for循環內數組中的每個值來設置player.rate

#import "P15AppDelegate.h"
#import "P15ViewController.h"

@interface P15AppDelegate ()
@property (nonatomic, strong) PAEAudioHost* host;
@property (nonatomic, strong) NSArray* channelStrips;
@property (nonatomic, strong) NSArray* filemnames;
@property (nonatomic) int nextVoice;
@end

@implementation P15AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.host = [PAEAudioHost audioHostWithNumOutputs:2];
    self.filemnames = @[@"guitar-E1.wav", @"guitar-A2.wav", @"guitar-D3.wav",
                        @"guitar-G3.wav", @"guitar-B3.wav", @"guitar-E4.wav"];
    const int numVoices = 8;

    NSMutableArray* channelStrips = [[NSMutableArray alloc] initWithCapacity:numVoices];

    for (int i = 0; i < numVoices; ++i)
    {
        PAEChannelStrip* channelStrip = [PAEChannelStrip channelStripWithNumChannels:2];
        [channelStrips addObject:channelStrip];
    }

    self.channelStrips = [NSArray arrayWithArray:channelStrips];

    PAEAmplitude* amp = [PAEAmplitude amplitudeWithNumInputs:2];
    amp.input = [PAEMixer mixerWithSources:self.channelStrips];
    amp.level.input = [PAEConstant constantWithValue:1.0 / numVoices];

    self.host.mainMix = amp;

    [self.host start];

    return YES;
}

-(void)play:(int)index velocity:(float)velocity;
{

    if (index >= 0 && index < self.filemnames.count)
    {
        PAEAudioFilePlayer* player = [PAEAudioFilePlayer audioFilePlayerNamed:self.filemnames[index]];
        player.loop = NO;
        player.rate - playbackRates[i]; --> **NEED TO ACCESS ARRAY HERE**

        PAEAmplitude* amp = [PAEAmplitude amplitudeWithNumInputs:player.numChannels];
        amp.input = player;
        amp.level.input = [PAEConstant constantWithValue:velocity];

        PAEChannelStrip* channelStrip = self.channelStrips[self.nextVoice];
        channelStrip.input = amp;

        self.nextVoice++;

        if (self.nextVoice == self.channelStrips.count)
            self.nextVoice = 0;
    }
}

@end

首先,您需要編寫一個公共的訪問在您的UIViewController子類的playbackRates陣列命名P15ViewController。

P15ViewController.h添加-

- (float)playbackRateAtIndex:(NSInteger)index;

P15ViewController.m添加-

- (float)playbackRateAtIndex:(NSInteger)index {
    return playbackRates[index];
}

您的appDelegate需要了解此方法,因此在您的P15AppDelegate.m中導入P15ViewController.h ,我認為您已經完成了。

然后假設的viewController的appDelegateRootViewController的 ,那么你可以用下面的代碼訪問它。

更換-

player.rate - playbackRates[i]; --> **NEED TO ACCESS ARRAY HERE**

與-

player.rate = [(P15ViewController*)self.window.rootViewController playbackRateAtIndex:i];

需要進行類型轉換,以便啟用訪問器(更具體地說是getter)的調用。

如果需要更直接的接入方式則改變吸氣或添加其他消氣劑在P15ViewController.m返回playbackRates陣列的輸入地址,這樣的-

- (float*)playbackRatesArray {
    return &playbackRates;
}

記住也要更新頭文件!

並從P15AppDelegate.m像這樣訪問它,因為C數組只是一個指針-

float* playbackRates = [(P15ViewController*)self.window.rootViewController playbackRatesArray];
player.rate = playbackRates[i];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM