【问题标题】:How to use custom nib view in ViewController multiple times如何在 ViewController 中多次使用自定义 nib 视图
【发布时间】: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"

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

【问题讨论】:

    标签: ios swift nib


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2012-08-08
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多