一个我不确定的基本问题。我通常会在UIViewController
中设置viewDidLoad
与视图相关的代码。如果控制器具有标签等的一些属性,那么我将初始化它们并将它们添加到视图中。这些属性通常在.m中声明,因此可以被视为伪私有。
但是 - 如果控制器在其头文件中公开其中一个属性(比如说UILabel
),我发现在设置它时我不能依赖它。例如:
CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil];
controller.someLabel.text = @"label text goes here";
//then comes the presentation code
我发现我过早地设置了标签的文字 - viewDidLoad
尚未解雇,因此标签为零。
我应该在init
中创建此标签并将其添加到viewDidLoad
吗?我应该在init
中完成所有设置吗?或者可能是视图属性的所有初始化?或者根据具体情况进行判断?
或许根本原因是我不应该让控制器暴露视图(标签)并使用其他模式?
我正在寻找一种结构化代码的一致方法。
答案 0 :(得分:3)
传递UILabel文本的一种方法,它创建一个新的字符串属性,让我们说self.myString
,从外部分配它,并在viewDidLoad中,在标签'文本中设置此属性
CustomViewController *controller = [CustomViewController alloc] initWithNibName:nil bundle:nil];
controller.myString = @"label text goes here";
在CustomViewController
:
- (void)viewDidLoad
{
[super viewDidLoad];
(...)
self.label.text = self.myString;
}
答案 1 :(得分:1)
我倾向于执行类似下面的操作,如果我只想按需更新视图(如果我想更频繁地更新它,那么我会在viewWillAppear
或通过{{ 1}}或其他一些通知机制)。
根据属性设置我的UI设置的私有方法:
KVO
为我的公共属性实现一个setter,如果已经加载了视图,则调用- (void)_updateUIForProperty {
// Handle UI update
}
方法:
_updateUIForProperty
然后为了处理在加载视图之前设置属性的情况,我们在- (void)setProperty:(<#property type#>)property {
_property = property;
if(self.isViewLoaded) {
[self _updateUIForProperty];
}
}
中执行类似的操作:
viewDidLoad