我最近也遇到了同样的问题。但是当我一步步调试它时,我找到了一个可能的原因。 (对不起,我也是Objective C的新手,所以我下面的解释可能不是那么准确和专业......我之前的背景主要是Web开发。)
如果你在你调用的那行之后设置一个断点
testViewController *viewController = segue.destinationViewController;
当你构建并运行项目时,你会发现destinationViewController中的UITextField属性并没有在断点处分配和启动(内存为0x0)。同时 NSString 属性已经分配和初始化(所以你可以设置它的值)。
我认为 UITextfield 可能是一个子视图,因此它仅在其父视图(目标视图)启动时才启动。但是 NSString 是一个不与任何视图关联的属性,所以它是由声明它的视图控制器分配和初始化的。
当我对此进行进一步测试时,我发现了一件非常有趣的事情:第二个视图是在 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 运行期间加载的。我做了如下测试代码:
在第一个视图控制器.m文件中:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSLog(@"1. %@, %@",[segue identifier],segue.destinationViewController);
Scene2Controller *scene2ViewController = [segue destinationViewController];
[txtScene2 resignFirstResponder];
NSLog(@"2. scene2ViewController: %@", scene2ViewController);
NSLog(@"3. txtScene1: %@; passValue: %@", [scene2ViewController txtScene1], scene2ViewController.passValue);
NSLog(@"4. View2: %@; passValue: %@", [scene2ViewController view], scene2ViewController.passValue);
NSLog(@"5. txtScene1: %@; passValue: %@", [scene2ViewController txtScene1], scene2ViewController.passValue);
//txtScene1 is the UITextfield property I declared in the second view controller
//txtScene2 is the UITextfield property I declared in the first view controller
//passValue is the NSString property I declared in the second view controller
}
在第二个视图控制器.m文件中:
- (void)viewDidLoad
{
NSLog(@"6. txtScene1: %@; passValue: %@", txtScene1,passValue);
[super viewDidLoad];
}
注意到我在 NSLog 消息之前添加了序列号。我发现最终的日志结果序列是 1,2,3,6,4,5 而不是 1,2,3,4,5,6。并且在日志3中,txtScene1结果为null(未启动),但是在日志4(第二个视图加载完毕)之后,在日志5中,txtScene1结果为NOT null并且已经启动。这表明在 segue 执行期间加载了第二个视图。所以我猜想在 segue 转换期间,第二个视图控制器对象的启动顺序是:第二个视图控制器 -> NSString 属性(以及其他类似的属性,如 NSInteger 等) -> 第二个视图 -> UITextfield 属性(和其他子视图属性)。
所以我在第一个视图控制器 .m 文件中更改了我的代码,如下所示:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
Scene2Controller *scene2ViewController = [segue destinationViewController];
[txtScene2 resignFirstResponder];
if ([scene2ViewController view]) {
if ([txtScene2.text isEqualToString:@""]) {
scene2ViewController.txtScene1.text = @"No Value";
} else {
scene2ViewController.txtScene1.text = txtScene2.text;
}
}
}
然后这段代码可以正常工作,并且值会直接传递给第二个视图中的 UITextfield 属性。
希望上面的解释清楚,对你有帮助。