让我们假设您正在将新的视图控制器推送到导航堆栈并需要设置UI属性(例如:UI标签的文字或其他内容)。初始化VC时,它的视图未设置(因此它们可能为零)。因此,设置属性不会起作用。例如:
SomeViewController *vc = [[SomeViewController alloc] init];
SomeViewController.someUILabel.text = @"foo";
[self.navigationController pushViewController:vc animated:YES];
这不会设置UI标签的文本,因为vc.view及其子视图为零。解决这个问题的几种方法是:
init
之后,执行类似[vc view]
的操作,这将加载视图,然后允许您设置属性。viewDidLoad
设置UI,如下所示:
SomeViewController *vc = [[SomeViewController alloc] init]; SomeViewController.uiTextLabel = @"foo"; [self.navigationController pushViewController:vc animated:YES]; // in viewDidLoad self.someUILabel.text = self.uiTextLabel
有没有可以接受的方法摆脱这个问题?其中一个比另一个更好还是有不同的解决方案?
答案 0 :(得分:2)
您不应该从另一个视图控制器设置标签值。控制器控制其视图。
您应该在NSString
中拥有SomeViewController
属性,并使用您想要的字符串设置该公共属性。然后,在SomeViewController
viewDidLoad
方法中,将标签的值设置为属性中的值。
答案 1 :(得分:0)
在将视图推入堆栈和推送的vc之后初始化视图,而不是推动视图。
答案 2 :(得分:0)
我发现最优雅的方法是: 在主VC中:
SomeViewController *vc = [[SomeViewController alloc] init];
SomeViewController.textForLabel = @"foo";
[self.navigationController pushViewController:vc animated:YES];
在推动的VC中:
@interface SomeViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
- (void)setTextForLabel:textForLabel
{
_textForLabel = textForLabel;
self.textLabel.text = self.textForLabel;
}
- (void)viewDidLoad
{
self.textLabel.text = self.textForLabel;
}
所以基本上你将属性设置为NSString
,然后在两个不同的位置调整UI。