以编程方式从xib加载自定义UIView

cod*_*ner 6 uiview ios swift

我已经创建了一个自定义UIView MySample.xib.我已经将类添加MyView到了File Ownerxib中.

MyView.swift

class MyView: UIView {

    @IBOutlet var view: UIView!

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

        setup()
    }

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

        setup()
    }

    func setup() {
        NSBundle.mainBundle().loadNibNamed("MySample", owner: self, options: nil)            
        self.addSubview(self.view)
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在MyView从这样的MyController文件加载它:

MyController.swift

class MyController: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)

        view.addSubview(MyView())

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
Run Code Online (Sandbox Code Playgroud)

现在要显示这个视图,我用来跟随另一个控制器的代码UIButton:

presentViewController(MyController(), animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

这会在屏幕上显示视图.但问题是,它不接受任何用户交互.在我的自定义视图中,我有一个UITableView,它显示数据,但由于缺乏用户交互,它不会滚动或点击.

知道我做错了什么吗?

Ole*_*man 12

你的例子中有一些不必要的东西.

我仍然不确定你想做什么,但如果你想从xib添加自定义视图到你的视图控制器,那么:

  1. 在xib文件中创建一个视图,你不需要覆盖init,也不能使用默认的init UIView()从xib初始化视图,所以请从MyView类中删除init方法.

  2. 在你的xib中确保你在IB中看到的视图是你想要使用的类类型(我猜MyView类).

  3. 在您的视图控制器中初始化视图如下:

    class MyController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //Get all views in the xib
            let allViewsInXibArray = NSBundle.mainBundle().loadNibNamed("MySample", owner: self, options: nil)
    
            //If you only have one view in the xib and you set it's class to MyView class
            let myView = allViewsInXibArray.first as! MyView
    
            //Set wanted position and size (frame)
            myView.frame = self.view.bounds
    
            //Add the view
            self.view.addSubview(myView)
    
            //TODO: set wanted constraints.
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 现在我收到此错误:`*** 由于未捕获的异常 'NSUnknownKeyException' 而终止应用程序,原因:'[<MyApp.MyController 0x7c127fb0> setValue:forUndefinedKey:]: 此类不符合键标签的键值编码.'` (2认同)