繁体   English   中英

从Xib文件动态加载iOS视图

[英]Loading iOS view dynamically from xib file

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

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

谢谢

我已经实现了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)
}

在您的自定义视图类中添加以下代码

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

将此类作为情节提要中的超类视图添加。

暂无
暂无

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

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