2009-06-29 29 views
2

FooViewController需要做一些初始化时,它创建一个视图控制器(中,本身不是管理视图 - 之前的观点是,即使装)。可以通过编程和IB实例化的View Controller?

我希望能够通过两种方式来创建它:

  1. 编程方式,可能会进行一些参数:

     
    FooViewController *fooViewController = [[[FooViewController alloc] initWithSomeData:data] autorelease]; 
    [self.navigationController pushViewController:fooViewController animated:YES]; 
    
  2. 在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中设置的titlewantsFullScreenLayoutnibName属性将被忽略,但没关系。该nibName在init硬编码和title设置有在情况下,控制器被实例化编程反正。

问题是没有设置parentViewController(默认initWithCoder:会根据NIB中对象的层次来设置它)。

?我怎样才能从笔尖父对象?然后我会改变initWithCoder:喜欢的东西:

 
- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if (self = [self init]) { 
     _parentViewController = [decoder parentObject]; 
    } 
    return self; 
} 

或者我应该使用一些不同的方法来创建它可以同时编程和IB被实例化控制器?

回答

0

不要,不要,不要试图做的是有和没有笔尖工作的视图控制器。这将是一场噩梦,因为nibloading使用了一些正常的入口点并提供了新的入口点,并且就操作系统版本而言它会变得脆弱。

你可以做的是它使视图控制器始终从笔尖加载,然后给自己一个方便初始化要经过笔尖:

- (id) init { 
    return [[[self class] alloc] initWithNibNamed:@"MyNibName" bundle:nil]; 
} 

然后你就可以通过其他笔尖引用它的正常方式,当你不想明确地处理笔尖时,只需调用便捷的init方法即可。

+0

是`[自我类]`应该只是`self`? 如果是这样,你实际上并没有从NIB加载视图控制器。 UIViewController的nibName属性是它的视图的NIB,而不是控制器本身。 我不认为每个控制器(一个为自己,一个为视图)有两个NIB是要走的路...:/ – 2009-06-29 16:29:07

+0

它是固定的,它应该是[[self class] alloc]因为我不知道你的班级是什么。为了做我建议你需要设置文件的所有者到你的班级。 initWithNibNamed所做的是初始化视图控制器,然后将所有到nib的连接绑定到刚刚初始化的VC中。看起来你正试图在笔尖中创建一个单独的视图控制器对象,你如何设置文件的所有者,我认为你正在与系统作战。 – 2009-06-29 16:57:44

0

为什么不这样做的init东西在viewDidLoad中 - 创造IB以外的时候,你可以设置初始值与初始化后,一些其他方法或属性,但在此之前viewDidLoad中被调用。

相关问题