gpt4 book ai didi

ios - Objective C block 属性始终为 nil

转载 作者:行者123 更新时间:2023-11-28 20:14:11 29 4
gpt4 key购买 nike

我正在尝试了解有关 Objective C block 及其工作原理的更多信息。我已经建立了一个简单的项目,其中两个 UIViewControllers 嵌入在 Storyboard 的 UINavigationController 中。我试图从第二个 View Controller 更改第一个 ViewController View 的背景颜色。这是一些代码:

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 的背景颜色没有改变,因为在 SecondViewController.m 的 buttonTapped: 方法中,self.colorBlock 为 nil,导致 block 调用不叫做。我以为我已经成功地在 prepareForSegue:sender: 中设置了 block 。为什么我的 block 属性为零?

最佳答案

在您的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;
}
}

关于ios - Objective C block 属性始终为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18774456/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com