Как я могу загрузить раскадровку программно из класса?

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

Ответ 1

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

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

Ответ 2

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> Показать инспектора идентификации> Идентичность> Идентификатор раскадровки

Свифт (наследие)

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)

Ответ 3

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

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];

Ответ 4

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

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

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

Ответ 5

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

present(vc, animated:true , completion: nil)

Ответ 6

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

Ответ 7

В Xamarion.iOS(С#):

var storyBoard = UIStoryboard.FromName(name: "Main", storyboardBundleOrNil: null);
var viewController = storyBoard.InstantiateViewController(identifier: "viewController");
NavigationController.PushViewController(viewController: viewController, animated: true);

Ответ 8

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

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

Ответ 9

Расширение ниже позволит вам загрузить 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
    }
}