2013-08-28 75 views
2

一个相当基本的问题,我不确定。我通常会建立我UIViewController的观点相关的代码在viewDidLoad。如果控制器具有标签等的一些属性,这是我将初始化它们并将它们添加到视图中的位置。这些属性通常在.m中声明,因此可以被认为是伪私有的。在哪里设置属性在UIViewController中

但是,如果控制器在其头文件中公开了其中一个属性(假设为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

如果它是由时间的viewDidLoad大火做好准备,那么这将是罚款,因为是viewDidLoad中发生之前将其设置在初始化。 – Jeremy

+0

是的,我只是偶尔以某种方式做这件事,而在其他时候以另一种方式做。猜猜我应该更务实。 –

+1

你会在哪里试图打电话给你的代码?从另一个控制器?如果是这样,您需要将该字符串传递给CustomController中的字符串属性,并让它将标签的文本设置为viewDidLoad。从MVC的角度来看,让控制器填充自己的用户界面更好,因此传递数据需要做的是正确的方式。 – rdelmar

回答

3

呀,你是非常正确的了。事情是,直到实际呈现视图之前,控制器的所有视图组件都不会被加载。所以你不能从控制器外部设置任何你的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; 
} 
+0

而且我还需要一个客户二传手吗?否则[控制器setMyString:]将不会更新文本字段。 –

+0

我不这么认为。这个辅助属性只有在这种情况下才有必要和使用,其中viewController被分配但尚未出现。在我的例子中,文本已经在'viewDidLoad'中设置了,所以你不需要自定义设置器。如果您想在课程外的其他地方再次更改标签的文本,则在显示视图后,您可以直接使用IBOutlet。 –

+0

但是,我必须记住,如果它在视图加载之前(字符串)使用一个属性,另一个如果它的后面(标签直接)(我在代码中完成所有这些,所以没有插座)。 –

1

我倾向于做类似以下的事情,如果我只想更新频率更高的视频(如果我想更频繁地更新视频,我会在viewWillAppear或通过KVO或其他通知机制)。

有确实根据的财产我的UI设置一些私有方法:

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

实现对我的公共属性的设置调用_updateUIForProperty方法如果视图已经被加载:

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

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

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

- (void)viewDidLoad { 
    // Other initialization 

    if(_property != nil) { 
     [self _updateUIForProperty]; 
    } 
} 
相关问题