在UIViewController中设置属性的位置

时间:2013-08-28 00:34:11

标签: ios objective-c uiview properties uiviewcontroller

一个我不确定的基本问题。我通常会在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中完成所有设置吗?或者可能是视图属性的所有初始化?或者根据具体情况进行判断?

或许根本原因是我不应该让控制器暴露视图(标签)并使用其他模式?

我正在寻找一种结构化代码的一致方法。

2 个答案:

答案 0 :(得分:3)

是的,你已经非常正确了。问题是,在实际呈现视图之前,不会加载控制器的所有视图组件。因此,您无法从控制器外部设置任何IBOutlet。

传递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