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]];