Swift - 以编程方式更改UIView,同时保留IBOutlets(文件所有者)

时间:2015-06-09 11:34:36

标签: ios swift uiview

这是一个粗略的草图,以帮助理解我尝试做的事情: enter image description here

我有一个MainViewController,它有一个UIView(MainView)

我有一个包含两个控件的.xib UIView(称为Window):

  1. segmentedController - 有四个段
  2. UIView(称为WindowUIView) - 将根据所选的段而改变
  3. 还有四个独立的.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
        }
    }
    

0 个答案:

没有答案