Ios 访问viewDidLoad vs ViewWillDisplay vs ViewDidDisplay中的属性

Ios 访问viewDidLoad vs ViewWillDisplay vs ViewDidDisplay中的属性,ios,objective-c,uiviewcontroller,lifecycle,Ios,Objective C,Uiviewcontroller,Lifecycle,我有一个正在加载到UIViewScroll中的详细视图。作为加载到滚动视图的一部分,我在详细视图上设置了一些属性,例如按钮(UIButton)和跳闸(NSString) 现在在细节控制器中,我尝试用三种不同的方法读取这些属性 - (void)viewDidLoad - (void)viewWillAppear:(BOOL)animated - (void)viewDidAppear:(BOOL)animated { NSLog(@"Button text %@",[[[self

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

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

- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated 
{
        NSLog(@"Button text %@",[[[self button] titleLabel]text]);
        NSLog(@"Trip text %@",[self trip] text]);    
}
我仅在读取ViewDidDisplay时获取属性值,对于viewDidLoad和ViewWillDisplay,我获取的所有值均为null

为什么呢?还有,在细节视图属性出现在屏幕上之前,我应该在哪里读写它们,这样用户在加载视图后就不会看到文本发生变化

谢谢你的帮助

从details controller.h添加跳闸声明

@property (nonatomic, strong) NSString *trip;

关于
ui按钮
问题,问题是您不能在
viewDidLoad
之前引用控制器的视图控件。因此,如果您创建了控制器,然后尝试立即设置按钮的标题,例如,这将不起作用,因为视图尚未创建。事实上,如果您在执行
setTitle
方法调用时查看
controller.button
的值,我怀疑您会看到它是
nil
。总之,一个视图控制器不应尝试访问属于另一个视图控制器的视图控件

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

关于
trip
变量,调用
setTrip
方法时,很难弄清楚那里发生了什么(这表明
trip
NSString
trip
属性的
NSLog
语句不一致。忽略trip的
NSLog
中存在不匹配的
]
这一事实,您还使用了
text
方法,如果
trip
的话,您会这样做例如,ode>UILabel。但是
NSString
对象没有
text
方法。您可能需要为我们共享您的
trip
属性声明,以便在这方面为您提供更多帮助。但是如果它也是
IBOutlet
,那么问题可能与我之前讨论的
按钮的问题相同de>

回到关于
viewDidLoad
v
viewwillbeen
viewdidbeen
的问题,这真的不重要。你的属性应该在这三种情况下都可以访问。实际上,人们通常使用
viewDidLoad
,除非有其他必要(例如,计时器或某些动画通常最好在
viewdideappear
中完成),但您在问题中没有明确指出在这种情况下
viewdideload
不合适


但正如我所说的,我怀疑问题在于创建
控制器的代码也试图访问其
IBOutlet
对象,这是您无法做到的。或者,您的插座可能没有正确连接。

您正确连接插座了吗?是的,IBOutlet连接到了正确的XIB控件r提示。更改代码以将NSString从父控制器传递到细节控制器。向细节控制器添加“@property(非原子,强)NSString*buttonLabel”。然后调用“[controller setButtonLabel:DestinationText]”在父控制器中进行设置。接下来在细节控制器的viewDidLoad中,[[self button]setTitle:buttonLabel for State:UIControlStateNormal]'。当我检查viewDidLoad中的buttonLabel仍然为零。但是当我执行'[[self button]setTitle:buttonLabel for State:UIControlStateNormal]'时,UI将填充buttonLabel。Magic?Trip声明为@property(非原子,强)NSString*trip;@FireFly关于您对
buttonLabel
nil
的评论,我不知道您是否定义了
@property
以及显式声明了类实例变量。您不应该为属性声明实例变量,而是让编译器为您合成这些变量。或者使用de>@synthesis buttonLabel=\u buttonLabel;
或完全省略
@synthesis
语句(在这种情况下,它会做同样的事情,自动合成带前导下划线的ivar)。@FireFly关于
trip
被定义为
NSString
NSLog
语句
NSLog的评论(@“行程文本%@”,[自行程]文本];
没有意义。缺少
[
,但是
NSString
没有
text
方法/属性,所以我认为这行至少会生成一个编译器警告,当然还有一个运行时异常。
NSLog
语句就是您记录
UILabel
文本的方式,但您告诉我们
trip
是一个错误
NSString
,而不是
UILabel
,因此我不确定如何将您关于
trip
NSString
的说法与您的
NSLog
声明相协调。
@property (nonatomic, strong) NSString *trip;