通过代码从一个 ViewController 切换到另一个

Switching from one ViewController to another by code

我想通过代码简单地显示来自已经激活的 ViewController 的第二个 ViewController。我想尽可能地只用编码来做到这一点(而不是在故事板中拖放东西)

我试过按照下面的方法操作,但是第二个视图没有弹出。

我的故事板。左边是初始视图,右边是我喜欢从初始视图打开的视图。在屏幕中点击了右视图,所以可以看到右侧的属性:

我的初始 UIViewcontroller class:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad();
        dosomestuff();

        showTimeline(); // << --------------------
    }


func showTimeline() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("Timeline") as! UIViewController
    self.presentViewController(vc, animated: true, completion: nil)
    //self.showViewController(vc, sender: self);

}

问题更新,因为不清楚我在问什么: 当我启动应用程序时,只有第一个屏幕出现。没有崩溃只是日志中的警告 "Warning: Attempt to present on whose view is not in the window hierarchy!"

任何帮助如何做到这一点?

您不应该在 viewDidLoad 中显示视图控制器。呈现新视图控制器的正确位置是在呈现当前视图控制器之后。

尝试从 viewDidAppear()

呼叫 showTimeLine()

当调用视图加载时,您的视图控制器实际上不是视图层次结构的一部分(通常不是视图控制器层次结构的一部分),因此无法呈现其他视图。你应该在尝试时看到日志警告。另外,如果第一个视图总是呈现另一个视图,那么它有什么意义,为什么不直接将第二个视图作为根...

因此,通过更改根控制器或在当前根视图实际显示在屏幕上后呈现来更改呈现。

如 Wain 所述,您需要像这样更改 rootController :

func showTimeline() {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("Timeline") as! UIViewController
    UIApplication.sharedApplication().keyWindow.rootViewController = vc;
}

或将showTimeline()加到ViewDidAppear:

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        showTimeline();
    }

认为它应该有效 ;)