从xib文件动态加载iOS视图

时间:2017-05-11 11:55:50

标签: ios swift xcode

我一直在寻找一个关于如何在我的故事板中重用xib文件中的视图的简单示例,但我发现的所有内容都已过时或无法解决我的问题 情况是我很简单:

  • 我的故事板中有一个viewController
  • 我从库中拖了两个视图
  • 我创建了一个myCustomView.xib和myCustomView.swift文件(它们现在都是空的)
  • 我在viewController上按钮(所以树(两个视图和一个按钮)在故事板中的viewController上一起设置)
  • 问题是:我希望在应用启动时动态加载一个视图,然后在按钮上单击加载另一个视图
  • 另一个问题:如何将myCustomView连接到该viewController

谢谢

2 个答案:

答案 0 :(得分:3)

我已经为UIView实施了扩展程序:

extension UIView {

    static func createInstance<T: UIView>(ofType type: T.Type) -> T {
        let className = NSStringFromClass(type).components(separatedBy: ".").last
        return Bundle.main.loadNibNamed(className!, owner: self, options: nil)![0] as! T
    }

}

通过这种方式,您可以以这种方式加载自定义视图:

func override viewDidLoad() {
    super.viewDidLoad()
    let customView = UIView.createInstance(ofType: CustomView.self) 
    self.view.addSubview(customView)
}

答案 1 :(得分:1)

在自定义视图类

中添加波纹管代码
class MyCustomView: UIView {


   @IBOutlet var contentView: UIView! // take view outlet

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

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


    func xibSetup() {
        contentView = loadViewFromNib()

        // use bounds not frame or it'll be offset
        contentView!.frame = bounds

        //Make the view stretch with containing view
        contentView!.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]

        // Adding custom subview on top of our view (over any custom drawing > see note below)
        addSubview(contentView!)
        layoutIfNeeded()
    }

    override func layoutIfNeeded() {
        super.layoutIfNeeded()
        print("layoutIfNeeded")


    }

    func loadViewFromNib() -> UIView! {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
        return view
    }
}

在故事板中将此类添加为超类视图。