UIStoryboard: Какой правильный способ получить активную раскадровку?

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

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

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

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

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

UPDATE:

OK. Я нашел его.

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

Если вы хотите получить активную раскадровку для 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.

Ответ 3

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

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

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

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

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
}

Ответ 4

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

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