2011-09-29 82 views
0

我问这个问题,因为它看起来viewDidLoad在初始化器的主块之前被调用并且我在初始化器中初始化的类变量在viewDidLoad中变为零。为了供您参考,我以编程方式执行了整个viewcontroller,并且创建了一个自定义初始化程序,以便我可以接受要在我的viewcontroller中使用的各种参数。当然,我的自定义初始化程序调用UIViewControllers指定的初始化程序。将参数发送到UIViewController的最佳方式是什么?

基本上,我很好奇什么是正确的设计模式发送参数到UIViewController?我已阅读关于此的其他线程,并没有真正得到明确的答案。我应该跳过初始化程序并手动设置属性(从课外)吗?这似乎有点不爽,我真的想发送一些参数,并且很好奇别人怎么去做这件事?

回答

7

原因初始化完成之前viewDidLoad中被调用时,可能是因为你调用视图方法在初始化器中。例如:

- (id)init 
{ 
    if ((self = [super init])) { 
     _thing = 123; 
     _other = self.view.frame.size.width/2; 
    } 

    return self; 
} 

viewDidLoad被称为当视图负载。您调用view方法后立即载入视图(如果您愿意,还可以访问视图属性)。所以你应该避免在init中引用视图。

要回答你的问题,我更喜欢为我的视图控制器创建一个init方法。

- (id)initWithThing:(MyThing *)thing thang:(MyThang *)thang 
{ 
    if ((self = [super init])) { 
     _thing = [thing retain]; 
     _thang = [thang retain]; 
     // ... 
    } 

    return self; 
} 

您也可以在启动后使用属性来设置额外的变量。就个人而言,我更喜欢只使用可选属性来完成此操作,并将所需的属性放在init方法中。这样我就无法启动无效状态的视图控制器。

1

基本上你应该为你的输入数据定义属性,但添加一个自定义的init函数。
如果你创建一个自定义的初始化方法,你应该没问题 - 记住initWithNibName:bundle:UIViewController的主要初始化程序,所以这是你想从你的自定义init-Method中调用的。 viewDidLoad总会后的customVC.view(无论是从您的代码或通过框架)第一次使用的初始化方法被称为:

- (id)initWithDataObject:(MyDataObject*)obj 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     self.dataObj = obj; 
    } 
    return self; 
} 
1

我将我的控制器的状态封装在一个附加的状态对象中。所以控制器通常拥有GUI元素的ivars和对这个状态对象的引用。

状态对象由我的委托上的StateManager对象处理。因此,如果让控制器引用另一个控制器并直接设置变量,则所有更改都将通过此管理器。多一点工作,但不太杂乱。

任何类都可以检索任何其他控制器的状态并进行更改。这是一些控制器的目的(例如:从专用控制器上选择YouTube上的视频)。但通常只有一个类获取状态以使用initWithState:来推送下一个控制器。推送的控制器然后将状态应用于其在viewDidLoad中的GUI或改变从前一类传递的状态对象。

StateManager保存所有状态对象的字典。我保持状态对象图亮,例如:我存储对图像的引用,但不存储图像本身。应用程序的真正优势在于Core Data,我只用这些来处理GUI状态。 StateManager侦听应用程序的退出事件并使用NSCoding将状态字典保存到磁盘。状态对象ivars总是零或一些有意义的值,没有悬挂指针。

我正在研究我的第二个iPhone应用程序,这似乎在工作,但我也很想知道其他人是如何做到的。任何输入是受欢迎的。

相关问题