FooViewController
需要做一些初始化时,它创建一个视图控制器(中,本身不是管理视图 - 之前的观点是,即使装)。可以通过编程和IB实例化的View Controller?
我希望能够通过两种方式来创建它:
编程方式,可能会进行一些参数:
FooViewController *fooViewController = [[[FooViewController alloc] initWithSomeData:data] autorelease]; [self.navigationController pushViewController:fooViewController animated:YES];
在Interface Builder。
对于(1)I会写这样的初始化:
- (id)initWithSomeData:(Data *)data // designated initializer { if (self = [super initWithNibName:@"FooView" bundle:nil]) { self.title = "Foo"; // perform initialization } return self; } - (id)init { return [self initWithSomeData:nilOrSomeDefaultValue]; } // ... other initializers that call the designated initializer
(I硬编码笔尖名称由于控制器总是使用相同的视图配置并且由于其查看它使用不关注呼叫者)
在Interface Builder中创建时,我希望最终结果与使用无参数init
进行初始化时的结果相同。
现在,如果我只是做:
- (id)initWithCoder:(NSCoder *)decoder { return [self init]; }
这是在督察Interface Builder中设置的title
,wantsFullScreenLayout
和nibName
属性将被忽略,但没关系。该nibName在init
硬编码和title
设置有在情况下,控制器被实例化编程反正。
问题是没有设置parentViewController
(默认initWithCoder:
会根据NIB中对象的层次来设置它)。
?我怎样才能从笔尖父对象?然后我会改变initWithCoder:
喜欢的东西:
- (id)initWithCoder:(NSCoder *)decoder { if (self = [self init]) { _parentViewController = [decoder parentObject]; } return self; }
或者我应该使用一些不同的方法来创建它可以同时编程和IB被实例化控制器?
是`[自我类]`应该只是`self`? 如果是这样,你实际上并没有从NIB加载视图控制器。 UIViewController的nibName属性是它的视图的NIB,而不是控制器本身。 我不认为每个控制器(一个为自己,一个为视图)有两个NIB是要走的路...:/ – 2009-06-29 16:29:07
它是固定的,它应该是[[self class] alloc]因为我不知道你的班级是什么。为了做我建议你需要设置文件的所有者到你的班级。 initWithNibNamed所做的是初始化视图控制器,然后将所有到nib的连接绑定到刚刚初始化的VC中。看起来你正试图在笔尖中创建一个单独的视图控制器对象,你如何设置文件的所有者,我认为你正在与系统作战。 – 2009-06-29 16:57:44