2013-08-20 2 views
23

Недавно я попробовал работать с MainStoryboard.storyboard в Xcode и пока все идет хорошо, и мне интересно, почему я никогда не использовал его раньше. Во время игры с некоторым кодом я столкнулся с препятствием, и я не знаю, как это разрешить.Раскадровка и пользовательский init

Когда я Alloc и инициализировать новый ViewController (с пользовательской инициализации я объявлен в классе 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

Спасибо. Кажется сумасшедшим, что Apple не предоставляет способ создания надлежащего пользовательского метода 'init' со Storyboards. – jowie

+2

Не знаю, почему можно было бы заявить: «Если весь ваш метод initWithCustomData установлен, задается одна переменная экземпляра, вы должны просто установить его вручную (без каких-либо индивидуальных или дополнительных методов)». В Apple нет документов, в которых говорится, что я бы посоветовал любому читателю считать это утверждение простым мнением, а не правилом следовать. Множество инициализаторов в iOS принимают даже один аргумент. – zumzum

+0

@zumzum Apple использует практику установки переменных в методе «prepareForSegue: sender:» в своем примере кода. См. Файл AddTimedReminder.m в [EKReminderSuite] (https://developer.apple.com/library/prerelease/ios/samplecode/EKReminderSuite/Introduction/Intro.html#//apple_ref/doc/uid/TP40015203- Intro-DontLinkElementID_2) пример для примера. –

16

Вы можете создать экземпляр ViewController в -init методом ,

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

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

    if(self) 
    { 
    //default initialization 

    } 
    return self; 
} 

и в пользовательском методе инициализации

- (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; 
} 

... один инициализатор;)

Смежные вопросы