Как я могу загрузить раскадровку программно из класса? - PullRequest
168 голосов
/ 27 марта 2012

Моя проблема в том, что я искал способ использовать и раскадровку и xib . Но я не могу найти правильный способ загрузить и показать раскадровку программно. Проект был начат с использованием xib, и теперь очень трудно вложить все файлы xib в раскадровку. Поэтому я искал способ сделать это в коде, например, alloc, init, push для viewControllers. В моем случае у меня есть только один контроллер в раскадровке: UITableViewController, который имеет статические ячейки с некоторым содержимым, которое я хочу показать. Если кто-нибудь знает правильный способ работы с XIB и раскадровкой без огромного рефакторинга, буду признателен за любую помощь.

Ответы [ 7 ]

351 голосов
/ 28 марта 2012

В вашей раскадровке перейдите к инспектору Атрибутов и установите Идентификатор контроллера представления.Затем вы можете представить этот контроллер вида, используя следующий код.

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
62 голосов
/ 28 августа 2015

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)

Предварительное условие

Назначьте Storyboard ID вашемуконтроллер вида.

Storyboard ID

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)
16 голосов
/ 25 апреля 2014

В инспекторе атрибутов задайте идентификатор для этого контроллера представления, и приведенный ниже код работает для меня

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];
3 голосов
/ 15 декабря 2014

Попробуйте это

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];
2 голосов
/ 24 января 2017

в быстром
NavigationController и pushController , которые можно заменить на

present(vc, animated:true , completion: nil)
1 голос
/ 31 января 2018

Для swift 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 "

0 голосов
/ 11 марта 2018

Вы всегда можете перейти прямо к корневому контроллеру:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
...