【问题标题】:Navigate to different view controllers inside the same window导航到同一窗口内的不同视图控制器
【发布时间】:2016-03-17 04:02:29
【问题描述】:

我在 Xcode 7.2.1 中创建了一个 OS X Cocoa 应用程序。我给 Main.storyboard 上的默认视图控制器一个 Storyboard ID 为“view1”。我添加了另一个视图控制器并给它一个故事板 ID“view2”。我向“view1”添加了一个按钮,并将操作链接到 ViewController.swift 并添加了以下代码:

@IBAction func view1Button(sender: AnyObject) {

    for v in view.subviews {
        v.removeFromSuperview()
    }

    let mainStoryboard: NSStoryboard = NSStoryboard(name: "Main", bundle: nil)
    let sourceViewController = mainStoryboard.instantiateControllerWithIdentifier("view2")
    self.view.addSubview(sourceViewController.view)
}

当我按下“view1”上的按钮时,一切都按预期工作。 “view1”被关闭,“view2”出现在同一个窗口中。

在“view2”上,我做了同样的事情。添加了一个按钮并将操作链接到 ViewController2.swift 并添加了以下代码:

@IBAction func view2Button(sender: AnyObject) {

    for v in view.subviews {
        v.removeFromSuperview()
    }

    let mainStoryboard: NSStoryboard = NSStoryboard(name: "Main", bundle: nil)
    let sourceViewController = mainStoryboard.instantiateControllerWithIdentifier("view1")
    self.view.addSubview(sourceViewController.view)
}

它没有按预期工作。当我单击“view2”上的按钮时,应用程序崩溃并收到以下错误:“线程 1:EXC_BAD_ACCESS(代码=1,地址=...)。我不明白为什么这不能按预期工作?

【问题讨论】:

    标签: swift macos cocoa nsviewcontroller


    【解决方案1】:

    我怀疑您崩溃的原因是没有对sourceViewController(您在view2Button(_:) 中实例化)的强引用。您将其视图添加为子视图,它将视图保存在内存中,但是一旦操作方法返回,将不会对视图控制器进行强引用,因此当从按钮发送操作消息时,没有视图控制器可以接收它。

    从这段代码的细节退一步,我建议做一些研究——你试图实现的东西在 Cocoa Programming for OS X 中被称为“视图交换”;在 iOS 中,它是“视图控制器包含”。如果有一个父视图控制器进行交换,它通常会更好。如果您手边有 Cocoa Programming for OS X 5th Edition,请查看第 31 章。但如果您没有,您也可以查看sample code for that chapter。不过,我还是建议您看看这本书(免责声明:我是这本书的合著者)。

    【讨论】:

    • 嘿 Adain,请看上面... ,几个文件,每个都是单独的视图?...每个场景都不同..
    • @AdrianSluyters 它们肯定有区别,但是一旦您引用了视图控制器(无论是从情节提要中加载它及其视图,还是实例化视图控制器并加载它视图),交换视图和维护对视图控制器的引用以使其留在内存中的原则是相同的。
    • 与较新的 Xcode 版本和控制器“引用”有一些不同之处。它们可以是“单一”或“多重”创建的,所以情况会有所不同。快速聊天,我将解释并解释两者之间的差异,以便您选择:)
    • 他的问题是当他关闭视图以调用另一个时,VC 被后台集合取消初始化......
    【解决方案2】:

    只是澄清一下您使用的是 Xibs(或 Nibs)还是情节提要?..

    如果您使用情节提要,则与单个控制器的工作方式略有不同......它们会自行加载(按预期顺序),并且需要相应地解决。

    所以如果使用故事板(我认为你和我一开始的时候一样,请告诉我们)。

    这一切都取决于你的控制器如何安排......

    故事板看起来像这样(例如):

    查看视图之间的链接等?

    其余的......看起来像这样(xib):

    【讨论】:

    • 我使用的是故事板,没有 XIB 文件。
    • 我在这里做了一个非常简单的例子。一个项目,两个目标。一个目标是codeless,即在视图之间使用内置的segue(转换)。另一个你手动调用转换...dl.dropboxusercontent.com/u/61211034/Stackoverflow/…
    • 希望能帮助并澄清我们所处的位置:D 这都是基于故事板的,所以应该是您正在寻找的......
    • 谢谢。我会看看。我能够通过稍微修改我发布的代码来解决这个问题。该应用现在可以按预期运行,并且在视图之间来回切换时不再崩溃。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2020-10-04
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多