这是一个粗略的草图,以帮助理解我尝试做的事情:
我有一个MainViewController,它有一个UIView(MainView)
我有一个包含两个控件的.xib UIView(称为Window):
还有四个独立的.xib UIViews(每个都有自己的IBOutlets和IBActions)将加载到WindowUIView中(随后加载到MainViewController' s UIView中)。
当' 选项1 '从segmentedController中选择我想将 Option1UIView 加载到 WindowUIView 中并执行 Option1UIView.swift 中包含的代码。
当' 选项2 '从segmentedController中选择我想将 Option2UIView 加载到 WindowUIView 并执行 Option2UIView.swift 中包含的代码。
选项3&等等等备选方案4
到目前为止,我已成功连接文件的所有者 - >自定义类 - >类将每个Option#UIViews(在它们的* .xib中)提供给相应的Option#UIView.swift
MainViewController的MainView 自定义类 - >类设置为Window Window.xib的WindowUIView 自定义类 - >类设置为Window Window的UIView(WindowUIView)文件的所有者 - >自定义类 - >类设置为Option1UIView
当应用程序在模拟器中运行时,事情按预期工作: MainViewController将其MainView更改为Window,然后将其视图更改为Option1UIView。 所有IBOutlets和IBActions都适用于Option1UIView。
但是,当我选择不同的段时,在WindowUIView(好)中加载了相应的Option#UIView,但代码不再连接。应用程序崩溃是因为.xib文件无法在它们各自的文件(* .swift)中找到以前连接到文件所有者的连接(IBOutlets& IBActions)。好像文件所有者已被删除。
我做错了什么? 这是错误: 对于关键视图,此类不符合键值编码(来自Option#UIView swift文件)。
更新: 这是Window.swift
中的代码class Window: UIView {
@IBOutlet var View: UIView! // Full view
@IBOutlet weak var Controller: UISegmentedControl!
@IBOutlet var View: WindowUIView! // The subView
required init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
NSBundle.mainBundle().loadNibNamed("Window", owner: self, options: nil)
self.addSubview(self.View)
}
@IBAction func controllerSwitch(sender: AnyObject) {
let value = Controller.selectedSegmentIndex
switch value {
case 0 : print("Option1")
NSBundle.mainBundle().loadNibNamed("Option1UIView", owner: self, options: nil)
self.WindowUIView.addSubview(self.View)
case 1 : print("Option2")
NSBundle.mainBundle().loadNibNamed("Option2UIView", owner: self, options: nil)
self.WindowUIView.addSubview(self.View)
case 2 : print("Option3")
NSBundle.mainBundle().loadNibNamed("Option3UIView", owner: self, options: nil)
self.WindowUIView.addSubview(self.View)
case 3 : print("Option4")
NSBundle.mainBundle().loadNibNamed("Option4UIView", owner: self, options: nil)
self.WindowUIView.addSubview(self.View)
default : print("Out of bounds")
}
}
我还有一个扩展来帮助加载Nib文件:
extension UIView
{
class func loadNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? UIView
}
}