在推送新VC时设置UI属性的可接受方法是什么?

时间:2014-07-25 12:56:00

标签: ios

让我们假设您正在将新的视图控制器推送到导航堆栈并需要设置UI属性(例如:UI标签的文字或其他内容)。初始化VC时,它的视图未设置(因此它们可能为零)。因此,设置属性不会起作用。例如:

SomeViewController *vc = [[SomeViewController alloc] init];
SomeViewController.someUILabel.text = @"foo";
[self.navigationController pushViewController:vc animated:YES];

这不会设置UI标签的文本,因为vc.view及其子视图为零。解决这个问题的几种方法是:

  1. 在VC上调用init之后,执行类似[vc view]的操作,这将加载视图,然后允许您设置属性。
  2. 设置非UI ivar,然后在viewDidLoad设置UI,如下所示:
    SomeViewController *vc = [[SomeViewController alloc] init]; 
    SomeViewController.uiTextLabel = @"foo";
    [self.navigationController pushViewController:vc animated:YES];
    // in viewDidLoad
    self.someUILabel.text = self.uiTextLabel
    
  3. 有没有可以接受的方法摆脱这个问题?其中一个比另一个更好还是有不同的解决方案?

3 个答案:

答案 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。