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

Posted

技术标签:

【中文标题】通过代码从一个 ViewController 切换到另一个【英文标题】:Switching from one ViewController to another by code 【发布时间】:2015-03-05 07:45:23 【问题描述】:

我想简单地通过代码从已经激活的 ViewController 中显示第二个 ViewController。我想尽可能只用编码来做到这一点(而不是在情节提要中拖放)

我尝试如下操作,但没有弹出第二个视图。

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

我最初的 UIViewcontroller 类:

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);


问题更新,因为不清楚我在问什么: 当我启动应用程序时,只有第一个屏幕出现。没有崩溃,只是日志中的一个警告“警告:尝试在其上显示不在窗口层次结构中的视图!”

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

【问题讨论】:

那么您遇到的具体问题是什么?它崩溃了吗?它什么都不显示?请说明您的问题。 在这里查看两个答案***.com/questions/24099533/… 【参考方案1】:

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

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

【讨论】:

关于“如果第一个视图总是呈现另一个视图有什么意义”,也许他想让用户能够返回到它以更改查看第二个视图的选项viewController 就像 WhatsApp 在他们的“从库中添加照片”功能中所做的那样 不知道我的屏幕设计好不好。我想要一个启动所有东西并加载数据的第一个视图(可能需要几分钟并在加载过程中显示图片和进度条),然后我想决定应该显示哪个视图。 @Wain:您的解决方案似乎是正确的,因为我收到了您提到的警告。知道我是 ios 的初学者,我不知道“在当前根视图实际显示在屏幕上之后呈现”是什么意思?【参考方案2】:

正如 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();
    

认为它应该有效;)

【讨论】:

非常感谢您的帮助。我猜你们俩都有正确的解决方案。现在我坚持实践。当我将“override func viewDidAppear() ”添加到我的“ViewController”时,我收到一个错误 Method does not override any method from its superclass。它与我的 "override func viewDidLoad() " 处于同一级别。我正在使用 Xcode 6.3。有什么帮助吗? 非常感谢您的帮助。现在它可以工作了,我学到了很多关于视图控制器的基础知识。我接受你的回答。【参考方案3】:

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

尝试从viewDidAppear() 拨打showTimeLine()

【讨论】:

以上是关于通过代码从一个 ViewController 切换到另一个的主要内容,如果未能解决你的问题,请参考以下文章

仅使用一个 ViewController 从 XIB 切换

在不同的 ViewController 中切换到新的 ViewController?

如何通过 AlertView 切换到另一个 ViewController 并执行 segue?

无法从 UILabel 切换到 ViewController

从 UIViewController 切换到 navigationController 内的其他 ViewController

如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?