如何从课程中以编程方式加载故事板?

时间:2012-03-27 19:34:33

标签: ios objective-c xcode storyboard xib

我的问题是我正在寻找使用 storyboard xib 的方法。但我找不到以编程方式加载和显示故事板的正确方法。 Project开始使用xib进行开发,现在很难将所有xib文件嵌套在storyboard中。所以我在代码中寻找一种方法,比如使用alloc, init, push的viewControllers。在我的情况下,我在故事板中只有一个控制器:UITableViewController,它有静态单元格,其中包含我想要显示的一些内容。如果有人知道在没有大量重构的情况下使用xib和storyboard工作的正确方法,我将非常感谢您的帮助。

8 个答案:

答案 0 :(得分:349)

在故事板中,转到“属性”检查器并设置视图控制器的标识符。然后,您可以使用以下代码显示该视图控制器。

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

答案 1 :(得分:60)

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&gt;显示身份检查器&gt;身份&gt;故事板ID

Swift(遗产)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

编辑:Fred A.

在评论中建议使用Swift 2

如果你想在没有任何navigationController的情况下使用,你必须使用如下:

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)

答案 2 :(得分:15)

在属性检查器中,为该视图控制器提供标识符,以下代码适用于我

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

答案 3 :(得分:3)

试试这个

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

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

答案 4 :(得分:2)

在快速中 NavigationController pushController 可以替换为

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

答案 5 :(得分:1)

对于 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中加载Storyboard,如下所示:

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上设置相同名称,并在枚举中添加故事板名称&#34; StoryBoardName &#34;

答案 6 :(得分:0)

您始终可以直接跳到根控制器:

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

答案 7 :(得分:0)

以下扩展名将允许您加载Storyboard及其关联的UIViewController。示例:如果您有一个名为UIViewController的{​​{1}}和一个名为“ ModalAlert”的情节提要,例如

ModalAlertViewController

将同时加载let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert") Storyboard,并且UIViewController的类型将为vc注意:假定情节提要的情节提要ID与情节提要具有相同的名称,并且该情节提要已标记为是初始视图控制器

ModalAlertViewController