繁体   English   中英

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

[英]Load custom UIView from xib programmatically

我在MySample.xib创建了一个自定义UIView。 我已将类MyView添加到xib的File Owner

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)
    }
}

我现在从MyController文件加载这个MyView ,如下所示:

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")
    }
}

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

presentViewController(MyController(), animated: true, completion: nil)

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

知道我做错了什么吗?

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

我仍然不确定你想做什么,但如果你想从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. } } 

我不得不将xib File's Owner类链接到MyView ,而是必须将xib中的根视图类更改为MyView 然后基于@Oleg Sherman代码,它完全适用于添加MyView()作为所有者的小变化来获取它的所有事件,否则它将抛出一个错误, this class is not key value coding-compliant for the key ****.

let allViewsInXibArray = NSBundle.mainBundle().loadNibNamed("MySample", owner: MyView(), options: nil)

只有在Storyboard中使用xib时,才需要File's Owner类用于MyView

不知道是否有一个解决方法,以编程方式从自定义控制器加载xib时,使用File's Owner类到MyView ,就像我原来的问题一样。

如果使用设计模式,则不必重新实例化两次。

这很简单。 写吧:

class MyController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    //Get all views in the xib
    let view = MyView() 
    self.view.addSubview(myView)

    //TODO: set wanted constraints.
}}

它会奏效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM