出于某种原因,我遇到了一个问题,在viewController的代码内部(在调用viewDidLoad方法之后运行良好),self总是返回nil。 (使用iOS 9.2.1在iPad Air上运行,以9.2为目标构建的应用程序。)
在初始化代码中,我们有一个普通的启动器:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
};
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) { }
return self;
}
viewController实例化如下:
myVC * myVC = [[myVC alloc] initWithNibName:nil bundle:nil];
myVC类和.xib文件的名称相同。
有一个名为:
的财产@property (weak, nonatomic) IBOutlet UILabel *ipAddressLabel;
在myVC内部的方法中,我有一个这样的方法:
- (void) networkPropertiesDidChange:(NSDictionary *)properties {
void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
[self.serialNumberField setEnabled:false];
};
if([properties[@"result" isEqualToString @"error"]) {
[Utility showBasicAlertControllerWithText:@"Device not registered." completionBlock:completionBlock sender:self];
return;
}
else if ([properties[@"result"] isEqualToString @"ipChange"]) {
NSString *newAddy = [[NSString alloc] initWithString:properties[@"ipAddress"]];
self.ipAddressLabel.text = newAddy;
return;
}
else return;
}
然而,地址标签只是空白。
当我执行代码时,在初始化newAddy的行上,self不是nil,而ipAddressLabel不是nil。但是当运行时命中self.ipAddressLabel.text时,它会通过initWithNibName,并为self返回 nil !然后将ipAddressLabel设置为nil,然后在视图上变为空白。
此时myVC已经成功加载并且在屏幕上。所以我无法理解为什么自我在这种方法中为自己回归为零......这很奇怪。
如果我删除了我对initWithNibName方法的覆盖,那么一切都完美无缺。如果我在设置self = [super ...]之前检查initWithNib名称的开头是否(self!= nil),那么视图将绘制大约1"屏幕太低而被切断。
试着理解为什么会这样。感谢。
答案 0 :(得分:0)
问题在于:
void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
[self.serialNumberField setEnabled:false];
};
它需要弱自我...
__weak typeof(self) weakSelf = self;
void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
[weakSelf.paxSerialNumberField setEnabled:false];
};
不要问我原因,我的大脑爆炸了。