2013-08-20 190 views
23

我最近嘗試使用Xcode中的MainStoryboard.storyboard,到目前爲止它非常好,我想知道爲什麼我以前從未使用它。在玩一些代碼的時候,我碰到了一個障礙,我不知道如何解決這個問題。故事板和自定義初始化

當我alloc和初始化一個新的視圖控制器(與我在ViewControllers類中聲明自定義的初始化)我會做這樣的事情:

ViewController *myViewController = [[ViewController alloc] initWithMyCustomData:myCustomData]; 

那之後我可以做類似:

[self presentViewController:myViewController animated:YES completion:nil]; 

當我使用故事板時,我發現切換到獨立的ViewController需要一個標識符。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 
[self presentViewController:myViewController animated:YES completion:nil]; 

如何在使用故事板時仍使用myViewController的自定義初始化?

它是確定,只是做這樣的事情:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
ViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 
myViewController.customData = myCustomData; 
[self presentViewController:myViewController animated:YES completion:nil]; 




//MyViewController.m 
- (id) initWithMyCustomData:(NSString *) data { 
if (self = [super init]) { 
    iVarData = data; 
} 
return self; 
} 

回答

17

我只想創造出確實的自定義數據加載的方法。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 
[myViewController loadCustomData:myCustomData]; 
[self presentViewController:myViewController animated:YES completion:nil]; 

如果所有initWithCustomData方法並設置一個實例變量,你應該隻手動設置(沒有自定義inits或額外的方法和要求):

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
MyViewController *myViewController = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"]; 
myViewController.iVarData = myCustomData; 
[self presentViewController:myViewController animated:YES completion:nil]; 
+14

感謝。看起來瘋狂的是,蘋果公司沒有提供一種方法來創建一個適用於故事板的定製'init'方法。 – jowie

+2

我不知道爲什麼會說:「如果你所有的initWithCustomData方法都設置了一個實例變量,你應該手動設置它(不需要自定義inits或額外的方法)」。沒有蘋果公司的文件說明,所以我建議任何讀者認爲這個陳述僅僅是一個意見,而不是一個遵循的規則。 iOS中的大量初始化器甚至只有一個參數。 – zumzum

+0

@zumzum Apple在示例代碼中使用了在'prepareForSegue:sender:'方法中設置變量的做法。請參閱[EKReminderSuite]中的「AddTimedReminder.m」文件(https://developer.apple.com/library/prerelease/ios/samplecode/EKReminderSuite/Introduction/Intro.html#//apple_ref/doc/uid/TP40015203- Intro-DontLinkElementID_2)示例項目。 –

16

可以在-init方法實例化視圖 - 控制。

- (instancetype)init 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 

    self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

    if(self) 
    { 
    //default initialization 

    } 
    return self; 
} 

和您的自定義init方法

- (instancetype)initWithImages:(NSArray *)images 
{ 
    self = [self init]; 

    if(self) 
    { 
    self.images = images; 
    } 

    return self; 
} 
+1

我不認爲你可以在Swift中做到這一點... –

+0

是的,它可能適用於ObjC,但不適用於Swift。 – Pranshu

2

我的版本:

- (instancetype)initWithData (NSArray *)someData 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 

    self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 

    if(self) 
    { 
    //default initialization 

    } 
    return self; 
} 

...一個初始化;)