如何在 ViewController 中多次使用自定义 nib 视图

Posted

技术标签:

【中文标题】如何在 ViewController 中多次使用自定义 nib 视图【英文标题】:How to use custom nib view in ViewController multiple times 【发布时间】:2015-02-16 22:21:16 【问题描述】:

我正在尝试从 nib 加载自定义 UIView

CustomView.swift

import UIKit

@IBDesignable class CustomView: UIView 

    var view: UIView!

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

        xibSetup()
    

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

        xibSetup()
    


    func xibSetup() 
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight

        addSubview(view)
    

    func loadViewFromNib() -> UIView 
        var nibName:String = "CustomView"
        var bundle = NSBundle(forClass: self.dynamicType)
        var nib = UINib(nibName: nibName, bundle: bundle)

        var view = nib.instantiateWithOwner(self, options: nil)[0] as UIView
        return view
    


CustomView.xib

文件的所有者是 CustomView 类。

在故事板中

我有一个 UIViewController(滚动视图控制器)和一个带有自定义类的 UIView:CustomView。 xib @IBDesignable 传播通过,一切都很好。

现在问题开始了。我试图在 ScrollViewController 中多次使用 customView(就像 tableView 中的单元格),就像我使用 viewOne 一样

ScrollViewController.swift

import UIKit

class ScrollViewController: UIViewController 

    let scrollView = UIScrollView()


    override func viewDidLoad() 
        super.viewDidLoad()

        let height = CGFloat(200.0)

        self.scrollView.frame = self.view.bounds
        self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, height*3)
        self.view.addSubview(self.scrollView)


        var y = CGFloat(0.0)

        for i in 0..<2 

            //Adding viewOne
            let viewOne = self.createViewOne(i)
            viewOne.frame = CGRectMake(0, y, 320, 200)
            self.scrollView.addSubview(viewOne)

            //Adding CustomView
            let customView = self.createCustomView(i)
            customView.frame = CGRectMake(0, y, 320, 200)
            self.scrollView.addSubview(customView)

            y += height
        

    


    func createViewOne(index: Int) -> UIView 
        let viewOne = UIView()

        if index == 0
            viewOne.backgroundColor = UIColor.greenColor()
        

        if index == 1
            viewOne.backgroundColor = UIColor.redColor()
        

        return viewOne
    


    func createCustomView(index: Int) -> UIView 
        let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView  --> Code breaks here

        if index == 0
            customView.backgroundColor = UIColor.greenColor()
        

        if index == 1
            customView.backgroundColor = UIColor.redColor()
        

        return customView
    



问题 代码在下面的行中断并且控制台输出没有帮助(lldb)

let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView

我也试过用这段代码实例化:

customView = CustomView.loadViewFromNib()

然后我收到错误“调用中参数 #1 的参数丢失”

1) 如何在 ViewController 中多次从 nib 加载自定义 UIView。 2) 如何更改视图中包含的 UI 元素,例如 UIImageView、UILabels 等。如何设置标题,如 customView.title.text = "Fido"

任何帮助将不胜感激!谢谢。

【问题讨论】:

【参考方案1】:

视图类的全部意义在于它加载了 nib 并将创建的视图添加为子视图。它也被定义为 nib 的所有者。

因此,当您的视图控制器尝试以自身为所有者加载 nib 时,它调用了所有的出口设置器,但它没有实现它们,因此它中断了。

要解决这个问题,您应该分配并初始化视图,而不是在视图控制器中显式地从 nib 加载它。

替换

let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView

let customView = CustomView()

【讨论】:

感谢您的回答。如果您能在代码中展示如何做到这一点,以及代码应该放在 ViewController 中的什么位置,将不胜感激。谢谢 然后我得到两个错误:.../XCode Projects/CustomViewNib/CustomViewNib/ScrollViewController.swift:76:13: 'let' 声明需要一个初始化表达式"Missing argument for parameter #1 in打电话”。 这行得通:让 customView = CustomView(frame: CGRectMake(0, 0, 320, 200))。它需要一个框架。 好的,是的,你覆盖了 2 个 init 方法,不包括普通版本(这可能是最好的)。 我在这一行得到 EXC_BAD_ACCESS - 让 view = nib.instantiateWithOwner(self, options: nil)[0] as!界面视图。我正在使用 Xcode 7.3.1

以上是关于如何在 ViewController 中多次使用自定义 nib 视图的主要内容,如果未能解决你的问题,请参考以下文章

同一个 Viewcontroller 多次弹出

iOS 为何使用runtime多次方法交换后却能按照交换顺序依次执行代码逻辑?

如何在自定义 UIView 中从 ViewController 传递数据

Swift - 如何在自定义 AlertController 中点击按钮时呈现 ViewController

如何在使用它的 ViewController 上调整自定义(在单独的文件中创建)UIView 高度?

如何在 ViewController 中调用所有自定义 UIView 的方法?