我尝试创建完美的解决方案,直接从代码和UIView
创建自定义Storyboard
子类。但是,我没有找到任何解决方案。
对于通过情节提要的IBDesignable
解决方案,我按照此示例http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6进行了完美操作。
但是,如果我尝试通过UIViewController
调用此扩展方法来调用此子类:
extension UIView {
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? UIView
}
}
它崩溃并说错过了this class is not key value coding-compliant for the key
。
有没有人找到与我分享的解决方案,因为它们有两种可能性?
我需要它,因为我应该在故事板中使用此UIView
,并将其作为UITableview SectionHeader
答案 0 :(得分:1)
为了保留这两种情况,我更喜欢在我的子类声明中写这个:
@IBDesignable class CustomView: UIView {
var view: UIView!
@IBOutlet weak var button: UIButton!
@IBOutlet weak var label: UILabel!
func xibSetup() {
view = loadViewFromNib()
view.frame = 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)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
return view
}
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
}
通过这种方式,我可以在storyboard
内看到并添加它。
在ViewForHeaderInSection
方法中,我写了这个:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let header = UIView()
let view:CustomView = CustomView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 30))
view.label.text = "header title: \(section)"
header.addSubview(view)
return header
}
所以它有效;)
答案 1 :(得分:0)
以下是如何在从故事板中实例化的视图控制器中使用xib(在您的情况下作为UITableView
的节头)。
在视图控制器类的viewDidLoad
方法中(从故事板中实例化的方法)
// Name your xib and swift class as Header
let headerNib = UINib(nibName: "Header", bundle: nil)
self.tableView.registerNib(headerNib, forHeaderFooterViewReuseIdentifier: "header")
实施UITableViewDelegate
方法viewForHeaderInSection
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("header") as! Header
// Customise your header view here
return header;
}
这就是你需要做的一切。