【问题标题】:Swift create Custom View from NibSwift 从 Nib 创建自定义视图
【发布时间】:2018-07-05 08:46:51
【问题描述】:

我尝试使用 Nib 文件实现自定义加载器视图。但我得到一个错误 在loadViewFromNib()

return nib.instantiate(withOwner: self, options: nil).first as? UIView.

线程 1:EXC_BAD_ACCESS(代码=2,地址=0x7ffee6f3df98)

open class LoaderView: UIView {

@IBOutlet var loaderImage: UIImageView!    
@IBOutlet var contentView: UIView!

func xibSetup() {
    contentView = loadViewFromNib()
    contentView.frame = bounds
    contentView.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
    addSubview(contentView)
}

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

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

func loadViewFromNib() -> UIView? {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "LoaderView", bundle: bundle)
    return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}

我在 VC 中将 viewDidLoad() 中的这个加载器称为

let loader = LoaderView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
view.addSubview(loader)

【问题讨论】:

  • 确保您在 XIB 的 FilesOwner 中设置了 class LoaderView

标签: ios swift xcode xib nib


【解决方案1】:

你的代码很好,没有递归

请确保你有

1) 仔细检查您的 IBOUTlet 连接

2) 在File's Owner中添加了你的类


我已经创建了与您的代码相同的代码

class CustomView: UIView {

    let nibName = "CustomView"
    @IBOutlet var view : UIView!

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

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

    func xibSetUp() {
        view = loadViewFromNib()
        view.frame = self.bounds
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
        addSubview(view)
    }

    func loadViewFromNib() -> UIView {

        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "CustomView", bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as! UIView

    }

}

看看输出

【讨论】:

  • 我确信文件所有者中的 IBOutlet 和 Xib 连接。你的代码是一样的。但仍然无法正常工作。我不使用 VC 的故事板。那里有什么问题吗?。
  • @AliUral 确保将您的 xib 添加到目标成员资格中(构建阶段检查复制捆绑资源)。还清理派生数据+清理项目或重新启动xcode
  • 我添加了一张图片
  • @AliUral 错了!! , 从那里删除加载器并添加到文件的所有者, 选中黄色框顶部的文件所有者写的地方
  • 谢谢兄弟。我给你的星星:)
【解决方案2】:

你有递归

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

你在xibSetup()中调用loadViewFromNib(),它调用UINib(nibName: "LoaderView", bundle: bundle),那调用required public init?(coder aDecoder: NSCoder)

developer.apple.com

【讨论】:

  • 这不是真的
  • @Prashant Tukadiya 为什么?很可能,视图的层次结构被破坏了。
  • 不,public init?(coder aDecoder: NSCoder) 会在从情节提要启动时调用,例如当您在情节提要中有视图并分配类 LoaderView 时。重要的是instantiate(withOwner: self, options: nil) 永远不会打电话给public init?(coder aDecoder: NSCoder)
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多