Моя проблема в том, что я искал способ использовать как раскадровку, так и xib . Но я не могу найти правильный способ программной загрузки и отображения раскадровки. Проект начинался с xib, и сейчас очень сложно вложить все xib-файлы в раскадровку. Поэтому я искал способ сделать это в коде, например, alloc, init, push
для viewControllers. В моем случае у меня есть только один контроллер в раскадровке: UITableViewController
со статическими ячейками с некоторым контентом, который я хочу показать. Если кто-то знает, как правильно работать как с xib, так и с раскадровкой без огромного рефакторинга, я буду признателен за любую помощь.
источник
[sb instantiateInitialViewController]
удобно, если вы хотите начать с контроллера представления сцены по умолчанию.[self presentViewcontroller]
логику этими строками в следующем порядке: 1)self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
2)self.window.rootViewController = vc;
и 3)[self.window makeKeyAndVisible];
. Вы также, вероятно, можете избавиться отmodalTransitionStyle
строки, потому что это не модальный переход от делегата приложения.Swift 3
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewController(withIdentifier: "viewController") self.navigationController!.pushViewController(vc, animated: true)
Swift 2
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") self.navigationController!.pushViewController(vc, animated: true)
Предпосылка
Назначьте идентификатор раскадровки своему контроллеру представления.
IB> Показать инспектора удостоверений> Идентификатор> Идентификатор раскадровки
Swift (наследие)
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController self.navigationController!.pushViewController(vc!, animated: true)
Изменить: Swift 2 предложен в комментарии Фреда А.
если вы хотите использовать без навигационного контроллера, вы должны использовать следующее:
let Storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = Storyboard.instantiateViewController(withIdentifier: "viewController") present(vc , animated: true , completion: nil)
источник
self.storyboard
объединить строки 1 и 2В инспекторе атрибутов укажите идентификатор для этого контроллера представления, и приведенный ниже код работает для меня.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; [self.navigationController pushViewController:detailViewController animated:YES];
источник
Попробуй это
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"]; [[UIApplication sharedApplication].keyWindow setRootViewController:vc];
источник
в Swift
NavigationController и pushController вы можете заменить на
present(vc, animated:true , completion: nil)
источник
Для быстрых 3 и 4 это можно сделать. Хорошая практика - установить имя Storyboard равным StoryboardID.
enum StoryBoardName{ case second = "SecondViewController" } extension UIStoryBoard{ class func load(_ storyboard: StoryBoardName) -> UIViewController{ return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue) } }
а затем вы можете загрузить свою раскадровку в свой ViewController следующим образом:
class MyViewController: UIViewController{ override func viewDidLoad() { super.viewDidLoad() guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return} self.present(vc, animated: true, completion: nil) }
}
Когда вы создаете новую раскадровку, просто установите то же имя в StoryboardID и добавьте имя раскадровки в свое перечисление « StoryBoardName »
источник
Вы всегда можете перейти прямо к корневому контроллеру:
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [storyboard instantiateInitialViewController]; vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentViewController:vc animated:YES completion:NULL];
источник
Приведенное ниже расширение позволит вам загрузить файл
Storyboard
и связанный с ним файлUIViewController
. Пример. Если у вас естьUIViewController
имяModalAlertViewController
и раскадровка с именем «ModalAlert», напримерlet vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")
Загрузит
Storyboard
иUIViewController
иvc
будет типаModalAlertViewController
. Примечание. Предполагается, что идентификатор раскадровки имеет то же имя, что и раскадровка, и что раскадровка помечена как « Исходный контроллер представления» .extension UIViewController { /// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller. /// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix. static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? { let storyboard = UIStoryboard(name: storyboardName, bundle: nil) if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T { vc.loadViewIfNeeded() // ensures vc.view is loaded before returning return vc } return nil } }
источник