Ios 访问viewDidLoad vs ViewWillDisplay vs ViewDidDisplay中的属性
我有一个正在加载到UIViewScroll中的详细视图。作为加载到滚动视图的一部分,我在详细视图上设置了一些属性,例如按钮(UIButton)和跳闸(NSString) 现在在细节控制器中,我尝试用三种不同的方法读取这些属性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
- (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
是NSString
对象没有text
方法。您可能需要为我们共享您的trip
属性声明,以便在这方面为您提供更多帮助。但是如果它也是IBOutlet
,那么问题可能与我之前讨论的按钮的问题相同de>
回到关于viewDidLoad
vviewwillbeen
和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;