UIStoryboard: как правильно получить активную раскадровку? - PullRequest
50 голосов
/ 24 марта 2012

Я в настоящее время яростно копаюсь во всех документах и ​​не совсем нашел то, что ищу. Я подозреваю, что это настоящий дурак! ответить.

Мне просто нужно найти активную раскадровку в основном комплекте, и я хочу знать, как лучше всего это сделать.

Это так, чтобы я мог использовать [UIStoryboard storyboardWithName:@"XXX" bundle:mainBundle] для извлечения работающей раскадровки.

Я знаю, как запутать это, включив идиому, но я чувствую, что это ... помеха.

Как правильно это сделать?

UPDATE:

OK. Я нашел это.

Как обычно, при переполнении стека (официальный сайт документации Apple;).

Вот код, на котором я остановился:

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];

Ответы [ 4 ]

39 голосов
/ 25 июня 2012

Если вы хотите получить активную раскадровку для viewController, есть свойство раскадровки.Вот как я решил это, вместо создания нового экземпляра:

LoginViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"firstLaunch"];
[navController presentModalViewController:vc animated:YES];

В Swift вы бы позвонили:

let loginViewController = navigationController?.storyboard?.instantiateViewController(withIdentifier: "firstLaunch") as! LoginViewController
navigationController?.present(loginViewController, animated: true, completion: nil)

Вы также могли бы быть намного безопаснее, используя охрану противконтроллер навигации и раскадровка.Я использовал as!, чтобы гарантировать, что вы получаете LoginController.

26 голосов
/ 25 марта 2012

OK.Как показывает мой комментарий выше, я нашел ответ на (плохо сформулированный вопрос):

Я хотел бы получить раскадровку main (не active ), так как я не использую несколько раскадровок в одном воплощении.Я использую стандартную модель 1 раскадровки для iPhone и 1 для iPad.Я просто хотел самый чистый способ получить раскадровку, чтобы я мог использовать ее для генерации контроллера представления.

Я нашел ответ в этого поста о переполнении стека и реализовал его с помощьюследующий код:

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
6 голосов
/ 20 июля 2016

В Swift вы должны использовать следующий синтаксис:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

Обратите внимание, что передача nil в bundle сделает вызов ссылкой на ваш main связывается автоматически.

Если вы используете контроллер представления , который у вас есть на раскадровке, и хотите напрямую создать оттуда раскадровку, вы можете просто сделать:

let storyboard: UIStoryboard? = self.storyboard // call this inside a VC that is on the Storyboard

Обратите внимание, что в последнем случае self.storyboard вернет необязательный Раскадровка (Storyboard?), поэтому, если вы хотите использовать его, разверните его так:

if let storyboard = self.storyboard {
  // access storyboard here
}
1 голос
/ 21 июня 2016

Я только что скопировал и вставил кодовую форму выше обновленного вопроса, чтобы каждый мог увидеть его как ответ.

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...