3

我不确定的一个相当基本的问题。我通常UIViewControllerviewDidLoad. 如果控制器有一些标签属性等,我将在此处初始化它们并将它们添加到视图中。这些属性通常在 .m 中声明,因此可以认为是伪私有的。

但是 - 如果控制器在其头文件中公开这些属性之一(比方说 a 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吗?或者也许是视图属性的所有初始化?还是根据具体情况判断?

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

我正在寻找一种一致的方式来构建我的代码。

4

2 回答 2

4

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

例如,传递 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;
}
于 2013-08-28T02:18:41.800 回答
1

我倾向于做类似以下的事情,如果我只想按需更新视图(如果我想更频繁地更新它,那么我会在viewWillAppear或通过KVO或其他一些通知机制中这样做)。

有一些私有方法可以根据属性进行我的 UI 设置:

- (void)_updateUIForProperty {
    // Handle UI update
}

为我的公共属性实现一个 setter,_updateUIForProperty如果视图已经加载,则调用该方法:

- (void)setProperty:(<#property type#>)property {
    _property = property;

    if(self.isViewLoaded) {
        [self _updateUIForProperty];
    }
}

然后为了处理在视图加载之前设置属性的情况,我们在下面做这样的事情viewDidLoad

- (void)viewDidLoad {
    // Other initialization

    if(_property != nil) {
        [self _updateUIForProperty];
    }
}
于 2013-08-28T00:46:19.710 回答