Подтвердить что ты не робот

Раскадровка и пользовательский 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;
}
4b9b3361

Ответ 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;
 }

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