什么是最好的方式发送参数到UIViewController?
我问这个问题,因为它看起来viewDidLoad在初始化器的主块之前被调用,并且我在初始化器中初始化的类variables在viewDidLoad中调用nil。 为了您的参考,我以编程方式完成这个viewcontroller,我已经创build了一个自定义的初始化,所以我可以采取各种参数在我的viewcontroller中使用。 我的自定义初始化器当然调用UIViewControllers指定的初始化器。
基本上,我很好奇什么是正确的devise模式发送参数到UIViewController? 我读过关于这个的其他线程,并没有真正得到一个明确的答案。 我应该跳过初始化并手动(从课外)设置属性? 这似乎有点不爽,我真的想发送一些参数,并好奇别人如何去做这个?
在初始化完成之前调用viewDidLoad的原因可能是因为您在初始化程序中调用了view方法。 例如:
- (id)init { if ((self = [super init])) { _thing = 123; _other = self.view.frame.size.width / 2; } return self; }
viewDidLoad
在视图加载时被调用。 当你调用view
方法时, view
就会加载(或者如果你愿意,访问视图属性)。 所以你应该避免在init中引用视图。
要回答你的问题,我更喜欢为我的视图控制器创build一个init方法。
- (id)initWithThing:(MyThing *)thing thang:(MyThang *)thang { if ((self = [super init])) { _thing = [thing retain]; _thang = [thang retain]; // ... } return self; }
启动后,您还可以使用属性来设置额外的variables。 就我个人而言,我更喜欢使用可选属性来完成此操作,并将所需的属性放在init方法中。 这样我就无法启动无效状态的视图控制器。
我将我的控制器的状态封装在一个额外的状态对象中。 所以控制器通常具有用于GUI元素的ivars和对这个状态对象的引用。
状态对象由我的委托上的StateManager对象处理。 因此,有一个控制器引用另一个控制器并直接设置variables,所有更改都通过此pipe理器。 多一点工作,但不太麻烦。
任何类都可以检索任何其他控制器的状态并更改它。 这是一些控制器的目的(例如:从专用控制器上selectYouTube上的video)。 但通常只有一个类获得一个状态来推动下一个控制器initWithState :. 推送的控制器然后将状态应用于其在viewDidLoad中的GUI或改变从前一类传递的状态对象。
StateManager保存所有状态对象的字典。 我保持状态对象图亮,例如:我存储对图像的引用,但不存储图像本身。 该应用程序的真正牛肉是在核心数据,我只用这一切来处理GUI状态。 StateManager侦听应用程序的退出事件并使用NSCoding将状态字典保存到磁盘。 状态对象ivars总是零或一些有意义的值,没有悬挂指针。
我正在研究我的第二个iPhone应用程序,这似乎是工作,但我也不知道其他人如何做。 任何input是受欢迎的。
基本上你应该为你的input数据定义属性,但添加一个自定义的初始化函数。
如果你创build一个自定义的init-Method你应该没问题 – 记住initWithNibName:bundle:
是UIViewController
的主要初始化方法,所以这就是你想从你的自定义init-Method调用的方法。 viewDidLoad
会在第一次使用customVC.view
(无论是从你的代码还是通过框架)的init-Method之后被调用:
- (id)initWithDataObject:(MyDataObject*)obj { self = [super initWithNibName:nil bundle:nil]; if (self) { self.dataObj = obj; } return self; }