推送新 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];
// 在 viewDidLoad 中
self.someUILabel.text = self.uiTextLabel
有没有一种公认的方法来解决这个问题?其中一个比另一个更好还是有不同的解决方案?
【问题讨论】:
你的意思是 vc.someUILabel.text = @"foo"; ? 在第二个视图控制器中获取 nsstring 属性并在推送时设置它。并在 secondviewcontroller 中使用它来设置文本。 【参考方案1】:您不应该从另一个视图控制器设置标签值。控制器控制其视图。
您应该在SomeViewController
中有一个NSString
属性,并使用您想要的字符串设置该公共属性。然后,在SomeViewController
viewDidLoad
方法中将标签的值设置为属性中的值。
【讨论】:
如果您从另一个 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 呈现