Раскадровка и пользовательский init
Недавно я попробовал работать с MainStoryboard.storyboard в Xcode и пока все идет неплохо, и мне интересно, почему я никогда не использовал его раньше. Во время игры с некоторым кодом я столкнулся с препятствием, и я не знаю, как это разрешить.
Когда я выделяю и запускаю новый ViewController (с пользовательским init, объявленным в классе 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;
}
Ответы
Ответ 1
Я бы просто создал метод, который выполняет загрузку пользовательских данных.
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];
Ответ 2
Вы можете создать экземпляр 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;
}
Ответ 3
Моя версия:
- (instancetype)initWithData (NSArray *)someData
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
self = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
if(self)
{
//default initialization
}
return self;
}
... один инициализатор;)