2012-06-19 31 views
1

我想要有一个自定义initWithNibName,基本上传入另一个NSString作为一种类型来确定此UIViewController基于类型的一些逻辑。所以我设置如下:自定义initWithNibName

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andFeedType:(NSString *)feedType 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

这是否有意义?因为我没有经常看到这种类型的init。如果没有,那么做这件事的最好方法是什么?

回答

1

这对我来说非常有意义。这就是你重写初始化器以在Objective-C中添加一些自定义初始化的方式。你认为什么是错的?

+0

我从来没有见过一个initWithNibName定制的,仅此而已。我认为这是一个错误的模式 – xonegirlz

1

它确实有道理。您正在创建您自己的初始化程序,并根据您的需求量身定制。另外,你正在做你应该做的事情,在你的自定义init方法中调用指定的初始化程序(在UIViewControllerinitWithNibName:bundle:的情况下)。

0

等等! 有一个原因可能不是最好的:这个方法是而不是当你的视图控制器从故事板加载时调用。为此,我建议使用viewDidLoad:代替自定义逻辑,并将自定义字符串设置为属性。

2

是的它是有道理的。另外,如果你想保持清洁你的初始化,你可以做到以下几点:

- (id)initWithFeedType:(NSString *)feedType 
{ 
    self = [super initWithNibName:@"YourNibName" bundle:nil]; // nil is ok if the nib is included in the main bundle 
    if (self) { 

     // Set your feed here (copy it since you are using a string) 

     // see the edit 
     myFeedType = [feedType copy]; 
    } 
    return self; 
} 

如需进一步信息由奥莱Begemann看到帖子initWithNibName-bundle-breaks-encapsulation

希望有帮助。

编辑

如果饲料属性不能被外部对象访问,为您的控制器像下面创建一个类扩展: