使用prepareForSegue方法时,IBOutlet属性不会更新 [英] IBOutlet properties does not update when using prepareForSegue method

查看:102
本文介绍了使用prepareForSegue方法时,IBOutlet属性不会更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题将值传递给destinationViewController的IBOutlet属性,但它在普通属性上工作正常,请参阅下面的代码

I am having problem passing value to a IBOutlet property of destinationViewController but it works fine on ordinary property see code below

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"NewsCellToDetail"]) {        
    testViewController *viewController = segue.destinationViewController;
    viewController.titleLabel.text = @"test"; // set the IBOutlet label text to something
    NSLog(@"%@",viewController.titleLabel.text); // this will output to nil
    viewController.textTest = @"testing2"; // set the property to something
    NSLog(@"%@", viewController.textTest) // this will output the string testing2
}

这是头文件testviewcontroller.h的代码。

This is the code for the header file testviewcontroller.h

#import <UIKit/UIKit.h>
@interface NewsDetailViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
@property (strong, nonatomic) NSString *textTest;
@end

我已经综合了这两处房产。

I already synthesize both the property.

感谢您的帮助。

推荐答案

我最近遇到了同样的问题。但是当我逐步调试它时,我发现了一个可能的原因。 (对不起,我也是Objective C的新手,所以我的以下解释可能不那么准确和专业......我以前的背景主要是网页开发。)

I just got the same problem recently. But when I debug it step by step, I find a possible reason. (I'm sorry I'm also new to Objective C, so my following explanation may be not that accurate and professional ... My previous background is mainly web development.)

如果你在你调用的行之后设置一个断点

If you set a breakpoint just after the line you call

testViewController * viewController = segue.destinationViewController;

当您构建并运行项目时,您会发现destinationViewController中的UITextField属性未在断点处分配和启动(内存为0x0)。同时NSString属性已经被分配和初始化(所以你可以设置它的值)。

when you build and run the project, you will find that the UITextField property in the destinationViewController is not allocated and initiated (memory is 0x0) at the breakpoint. Meanwhile the NSString property is already allocated and initialised (so you can set its value).

我认为UITextfield可能是一个子视图,因此它只在其父视图时启动(目标视图)已启动。但NSString是一个与任何视图都没有关联的属性,所以它是通过声明它的视图控制器分配和启动的。

I think probably UITextfield is a child view, so it only initiates when its parent view (the destination view) is initiated. But NSString is a property that is not associated with any view, so it is allocated and initiated with the view controller which declares it.

当我对此进行进一步的测试时,我发现一个非常有趣的事情:第二个视图是在 - (void)prepareForSegue:(UIStoryboardSegue *)segue发送者:(id)发件人运行期间加载的。我做了如下测试代码:

When I do a further test of this, I find a very interesting thing: the second view is loaded during the - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender runs. I do a test code like below:

在第一个视图控制器.m文件中:

In the first view controller .m file:

- (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 

}

在第二个视图中controller .m文件:

In the second view controller .m file:

- (void)viewDidLoad
{
    NSLog(@"6. txtScene1: %@; passValue: %@", txtScene1,passValue);


    [super viewDidLoad];

}

注意到我在NSLog消息之前添加了序列号。我发现最终的对数结果序列是1,2,3,6,4,5而不是1,2,3,4,5,6。在log 3中,txtScene1结果为null(未启动),但在log 4(加载第二个视图)之后,在log 5中,txtScene1为非null且已启动。这表明在segue执行期间加载了第二个视图。所以我想在segue过渡期间,第二个视图控制器对象的启动序列将是:第二个视图控制器 - > NSString属性(和其他类似属性,如NSInteger等) - >第二个视图 - > UITextfield属性(和其他子视图属性)。

Noticed that I add sequential numbers before NSLog messages. I found the final log result sequence was 1,2,3,6,4,5 rather than 1,2,3,4,5,6. And in log 3, the txtScene1 result was null (not initiated), but after log 4 (the second view was loaded), in log 5, the txtScene1 was NOT null and has been initiated. This suggested that the second view was loaded during the segue performs. So I guess that during the segue transition, the initiation sequence of the second view controller objects would be: second view controller -> NSString property (and other similar properties, like NSInteger, etc.) -> second view -> UITextfield property (and other subview properties).

所以我在第一个视图控制器.m文件中更改了我的代码,如下所示:

So I changed my codes in the first view controller .m file as below:

- (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属性。

This code then works fine and the value is passed directly to the UITextfield property in the second view.

希望上面的解释清楚明白,对你有帮助。

Hope above explanation is clear and helpful for you.

这篇关于使用prepareForSegue方法时,IBOutlet属性不会更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆