我在至少在 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/