访问viewDidLoad中的属性vs viewWillAppear vs viewDidAppear

时间:2013-06-01 00:48:20

标签: ios objective-c uiviewcontroller lifecycle

我有一个正在加载到UIViewScroll中的详细视图。作为将其加载到滚动视图中的一部分,我在详细信息视图上设置了一些属性,例如按钮(UIButton)和行程(NSString)。

[controller.button setTitle:text forState:UIControlStateNormal];
[controller setTrip:[tripIDs objectForKey:[sortedTrips objectAtIndex:page]]];

现在在详细控制器中,我尝试用三种不同的方法读取这些属性

- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated 
{
        NSLog(@"Button text %@",[[[self button] titleLabel]text]);
        NSLog(@"Trip text %@",[self trip] text]);    
}

我在viewDidAppear中读取时只获取属性值,对于viewDidLoad和viewWillAppear,我得到的只是null。

为什么?此外,我应该在哪里阅读和编写之前它们出现在屏幕上的详细视图属性,以便用户在视图加载后看不到文本更改?

感谢您的帮助!

从详细信息controller.h添加旅行声明

@property (nonatomic, strong) NSString *trip;

1 个答案:

答案 0 :(得分:0)

关于UIButton问题,问题是您无法将控制器的视图控件之前引用到viewDidLoad。因此,如果您创建控制器而不是尝试立即设置按钮的标题,例如,由于尚未创建视图,这将无效。实际上,如果您在进行controller.button方法调用时查看setTitle的值,我怀疑您会看到它是nil。最重要的是,一个视图控制器永远不应该尝试访问属于另一个视图控制器的视图控件。

您需要做的是在首次实例化视图控制器时设置的目标控制器中创建NSString属性。然后viewDidLoad应该执行setTitle,将标题设置为您在NSString属性中存储的值。

关于您的trip变量,由于您调用setTrip方法(表明tripNSString),因此很难弄清楚那里发生了什么包含NSLog trip属性的]声明。忽略了NSLog行程中text不匹配的事实,您还使用了{{1}例如,如果tripUILabel,您就可以执行此操作。但是NSString个对象没有text方法。您可能需要分享您对trip财产的声明,以便我们为您提供更多帮助。但如果它也是IBOutlet,则问题可能与我先前关于{{button的讨论相同1}}。

回到关于viewDidLoad v viewWillAppearviewDidAppear的问题,这无关紧要。您应该可以访问这三个属性。作为一种惯例,人们通常使用viewDidLoad除非需要其他东西(例如定时器或某些动画通常最好在viewDidAppear中完成),但你没有在你的问题中明确提出任何建议在这种情况下,viewDidLoad不会很好。

但正如我所说,我怀疑问题是你创建controller的代码也试图访问一些你不能做的IBOutlet对象。或者,您的网点可能没有正确连接。