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 になっているのはなぜですか?