推送新 VC 时设置 UI 属性的公认方法是啥?

Posted

技术标签:

【中文标题】推送新 VC 时设置 UI 属性的公认方法是啥?【英文标题】: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 及其子视图为零。解决此问题的几种方法是:

    在 VC 上调用 init 后,执行 [vc view] 之类的操作,这将加载视图,然后允许您设置属性。 设置非 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 中使用它来设置文本。 【参考方案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。

【讨论】:

以上是关于推送新 VC 时设置 UI 属性的公认方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

当每个新的视图控制器被推送时,调整导航控制器的大小以模态 UIModalPresentationFormSheet 呈现

推送时出现大标题导航栏和搜索栏的错误

使用视图模型中的属性值实现方法的最佳实践是啥?

导航栏在动画期间不反映新的文本属性到前一个视图控制器

_adjustContentOffsetIfNecessary - UIScrollView 自动滚动到顶部

在 Delphi 中使用框架的公认方法是啥?