ios - 在 Swift 中以编程方式从 MainViewController 到 .xib View ?

标签 ios swift uiviewcontroller segue

我在至少在 iOS 8 或更高版本上找不到有关执行 segue 或使用 swift 进行某种 View 转换的帮助。除了实现从主视图 Controller 到 xib 的 segue 之外,我还尝试尽可能避免使用 Storyboard 编辑器。

这是我到目前为止所拥有的:

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

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

*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“SwitchRegionSegue” Nib ,但未设置 View 导出。'

我也有这两个文件,如下所示:

SwitchRegionSegue.xib

SwitchRegionSegue.swift

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

我的 SwitchRegionSegue.swift 只是一 block 空白 Canvas ,如下所示:

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) 从UIViewController继承SwitchRegionSegue,而不是UIView

2) 设置您的 xib 的类别

3) 将 Nib 中的 View 对象连接到 View 导出

然后在主 ViewController 中编写以下代码:

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

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

关于ios - 在 Swift 中以编程方式从 MainViewController 到 .xib View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320101/

相关文章:

swift - 在核心数据中检索具有已过滤子级的父级

ios - 如何使用 self 和 enum 在 Swift 中设置条件断点的条件?

iphone - 如何确定 View Controller

iphone - didReceiveRemoteNotification - 在当前 View Controller 中调用函数

ios - Swift 3 - 根据 mp3 的长度自动滚动 UITextView

ios - Reusable Cell 没有调用 prepareForReuse 函数

xcode - 无法再在Xcode 4中存档

ios - 我可以在不实时插入 XCode 的情况下在 iPhone 上模拟我的位置吗?

ios - 如何正确地将值传递给谷歌地图 url 方案回调?

objective-c - 容器 View Controller 示例