0

我正在尝试了解有关 Objective C 块及其工作原理的更多信息。我已经建立了一个简单的项目,其中两个 UIViewControllers 嵌入在 Storyboard 的 UINavigationController 中。我正在尝试从第二个视图控制器更改第一个 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

第二视图控制器.m

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

第一个 ViewController 的背景颜色没有被改变,因为在buttonTapped:SecondViewController.m 的方法中,self.colorBlock是 nil,导致块调用不被调用。我以为我已经成功设置了prepareForSegue:sender:. 为什么我的块属性为零?

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 回答