Swift 从 Nib 创建自定义视图
Posted
技术标签:
【中文标题】Swift 从 Nib 创建自定义视图【英文标题】:Swift create Custom View from 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 中设置了 classLoaderView
【参考方案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)
以上是关于Swift 从 Nib 创建自定义视图的主要内容,如果未能解决你的问题,请参考以下文章
从 Connections Inspector 中隐藏 Outlets 以获取自定义视图