在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?

Posted

技术标签:

【中文标题】在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?【英文标题】:Programmatically segue from MainViewController to .xib view in Swift? 【发布时间】:2015-10-24 15:50:42 【问题描述】:

至少在 ios 8 或更高版本上,我无法找到有关使用 swift 执行 segue 或某种视图转换的帮助。除了实现从主视图控制器到 xib 的转场之外,我试图尽可能避免使用情节提要编辑器。

这是我目前所拥有的:

    let bundle = NSBundle(forClass: self.dynamicType)
    let secondViewController = ViewController(nibName: "SwitchRegionSegue", bundle: nil)
    self.presentViewController(secondViewController, animated: true, completion: nil)

上面的代码是从主 ViewController.swift 使用 Single View Application 新项目脚手架调用的。但它会导致崩溃:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SwitchRegionSegue" nib but the view outlet was not set.'

我也有这两个文件:

SwitchRegionSegue.xib

SwitchRegionSegue.swift

我已确保将 xib 的文件所有者自定义类设置为 SwitchRegionSegue : UIView

我的 SwitchRegionSegue.swift 只是一个空白画布,看起来像这样:

import UIKit

class SwitchRegionSegue: UIView 

    var view: UIView!

    var nibName = "SwitchRegionSegue"

    func xibSetup() 
        view = loadViewFromNib()

        // use bounds not frame or it'll be offset
        view.frame = bounds

        // Make the view stretch with containing view
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    

    func loadViewFromNib() -> UIView 

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        xibSetup()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        xibSetup()
    


有人知道我在这里做的不对吗? (推荐一本好的 swift & xib 教科书会很棒)

【问题讨论】:

【参考方案1】:

我从您的代码中注意到的问题:

1) 从 UIViewController 继承 SwitchRegionSegue 而不是 UIView

2) 设置你的 xib 的类

3) 将 nib 中的视图对象连接到 view 出口

然后在你的主 ViewController 中编写这段代码:

override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(animated)

    let secondViewController = SwitchRegionSegue(nibName: "SwitchRegionSegue", bundle: nil)
    self.presentViewController(secondViewController, animated: true, completion: nil)

【讨论】:

【参考方案2】:

.xib文件中,有两件事必须是真的:

文件所有者代理的类在身份检查器中设置为视图控制器的类。

File's Owner 代理的view 出口必须连接到 nib 中的视图对象。

你忘记了其中之一。

【讨论】:

既然你要教科书:apeth.com/iOSBook/ch19.html#_view_in_a_separate_nib(当前版本是Swift,但事实没有改变,所以就可以了) 我的文件所有者没有视图出口,我知道你在说什么:***.com/questions/4763519/… 但是,我的文件所有者在“SwitchRegionSegue”中没有视图出口。如何为我的 xib 文件所有者提供查看出口?我已经在 SwitchRegionSegue.swift 中声明了一个名为“view”的 UIView 属性。 view 出口仅在您完成第一步 步骤后才会出现,为文件所有者提供正确的视图控制器类。

以上是关于在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 5 中以编程方式从右上角添加垂直按钮列表

如何在 Swift 中以编程方式打开 icloud 应用程序(文件)

在 Swift 中以编程方式创建垂直 UIScrollView

如何在Swift中以编程方式从另一个图像中剪切徽标的形状(png图像)?

当 BLE 在 Swift 中以编程方式连接时,蓝牙设备设置中缺少信息按钮

在 SWIFT OS X 中以编程方式添加和删除 NSTextField