0

Objective C のブロックとその仕組みについてもっと学ぼうとしています。Storyboard の UINavigationController に 2 つの UIViewController が埋め込まれた単純なプロジェクトをセットアップしました。最初のViewControllerのビューの背景色を2番目のView Controllerから変更しようとしています。ここにいくつかのコードがあります:

ViewController.m

@implementation ViewController{
    ColorBlock _colorBlock;
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"theSegue"]){
        SecondViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
        vc.colorBlock = _colorBlock;
    }
}

- (IBAction)moveToSecondViewController:(id)sender {
    __weak id weakSelf = self;
    _colorBlock = ^{
        [[weakSelf view] setBackgroundColor:[UIColor redColor]];
    };
}

SecondViewController.h

typedef void (^ColorBlock)(void);

@interface SecondViewController : UIViewController

@property (readwrite, copy) ColorBlock colorBlock;

@end

SecondViewController.m

- (IBAction)buttonTapped:(id)sender {
    if(self.colorBlock){
        self.colorBlock();
    }
}

最初の ViewController の背景色は変更されません。これはbuttonTapped:、SecondViewController.m のメソッドself.colorBlockが nil であるため、ブロック呼び出しが呼び出されないためです。でブロックの設定に成功したと思いましたprepareForSegue:sender:。ブロック プロパティが nil になっているのはなぜですか?

4

1 に答える 1

3

ではprepareForSegue、宛先はすでにインスタンス化されています。したがって、それが目的地であると仮定するSecondViewControllerと、次のことができます。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"theSegue"]){
        SecondViewController *vc = segue.destinationViewController;
        NSAssert([vc isKindOfClass:[SecondViewController class]], @"destination is not SecondViewController class");
        vc.colorBlock = _colorBlock;
    }
}
于 2013-09-12T21:25:07.650 に答える