将数组从 ViewController 传递给 AppDelegate

Posted

技术标签:

【中文标题】将数组从 ViewController 传递给 AppDelegate【英文标题】:Pass an array from ViewController to AppDelegate 【发布时间】:2015-04-04 00:49:55 【问题描述】:

我有一个浮点值数组,称为playbackRates,在ViewController 中设置。我想在我的 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 - player.rate 需要在 play 方法的 for 循环中由数组中的每个值设置

#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

【问题讨论】:

您可以将您的数组作为属性保存在应用程序委托中,然后在任何地方使用它。但这也不是一个好主意。您应该考虑创建数据库或外部文件(plist)或 NSUserDefault 之类的东西。 【参考方案1】:

首先,您需要在名为 P15ViewControllerUIViewController 子类中为 playbackRates 数组编写一个公共访问器。

P15ViewController.h 添加-

- (float)playbackRateAtIndex:(NSInteger)index;

P15ViewController.m 添加-

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

你的 appDelegate 需要知道这个方法,所以在你的 P15AppDelegate.m 中导入 P15ViewController.h,我看到你已经已经完成了。

那么假设 viewControllerappDelegaterootViewController 那么您可以使用以下代码访问它。

替换 -

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

与 -

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

需要类型转换才能调用访问器(更具体地说是getter)

如果需要更直接的访问方式,则更改 getter 或添加另一个 getter 以在 P15ViewController.m 中返回 playbackRates 数组的类型化地址 -

- (float*)playbackRatesArray 
    return &playbackRates;

记得更新头文件!

然后像这样从 P15AppDelegate.m 访问它,因为 C 数组只是一个指针 -

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

【讨论】:

无论我尝试哪种方式,都会在设置 'player.rate = ' 的行上收到一条错误消息,说“分配给只读属性” - 有什么想法吗? 这意味着您正在尝试将值分配给只读属性。在这种情况下,PAEAudioFilePlayer 类的 rate 属性很可能已被声明为只读。 那我该如何使用数组来设置这个属性呢?

以上是关于将数组从 ViewController 传递给 AppDelegate的主要内容,如果未能解决你的问题,请参考以下文章

使用没有 segues 的协议将数组从 appDelegate 传递到 Viewcontroller

将数组数据从 CollectionView 传递到下一个 ViewController

从按钮将值传递给视图控制器字典

如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭

将数组数据从 ViewController 传递到 TableView

将数组从一个 UIViewController 传递到另一个 ViewController 返回 null