【问题标题】:What is the accepted way to set UI properties when pushing a new VC?推送新 VC 时设置 UI 属性的公认方法是什么?
【发布时间】:2014-07-25 12:55:59
【问题描述】:

假设您将一个新的 View Controller 推送到导航堆栈上,并且需要设置一个 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 动画:YES]; // 在 vi​​ewDidLoad 中 self.someUILabel.text = self.uiTextLabel

有没有一种公认的方法来解决这个问题?其中一个比另一个更好还是有不同的解决方案?

【问题讨论】:

  • 你的意思是 vc.someUILabel.text = @"foo"; ?
  • 在第二个视图控制器中获取 nsstring 属性并在推送时设置它。并在 secondviewcontroller 中使用它来设置文本。

标签: ios


【解决方案1】:

您不应该从另一个视图控制器设置标签值。控制器控制其视图。 您应该在SomeViewController 中有一个NSString 属性,并使用您想要的字符串设置该公共属性。然后,在SomeViewControllerviewDidLoad 方法中将标签的值设置为属性中的值。

【讨论】:

  • 如果您从另一个 VC(例如图像 URL)设置其他具有 UI 后果的内容,该怎么办。您可能想在属性的 setter 中更新 UI,但除非初始化视图,否则它会遇到同样的问题,对吧?
  • @u_ser722345 不,这不是同一个问题。当然,当你设置了属性并且视图没有初始化时,UI 更新将不起作用。但是在您的 viewDidLoad 方法中,您将让您的控制器获取属性的值并相应地更新 UI。所以会有 2 次 UI 更新。一个从 viewDidLoad 调用,另一个从你的属性的 setter 调用。
【解决方案2】:

在将视图推送到堆栈和推送的 vc 而不是推送它的那个之后初始化视图。

【讨论】:

    【解决方案3】:

    我发现最优雅的方法是: 在主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。

    【讨论】:

      猜你喜欢
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2017-11-11
      相关资源
      最近更新 更多