2012-06-19 28 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

希望有幫助。

編輯

如果飼料屬性不能被外部對象訪問,爲您的控制器像下面創建一個類擴展: