У меня есть базовый класс под названием DesignableControl
. Я использую его в своих пользовательских представлениях, чтобы видеть их в раскадровке. Вот базовый класс:
public class DesignableControl: UIControl {
private var view: UIView!
override public init(frame: CGRect) {
super.init(frame: frame)
configureViewForStoryboard()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configureViewForStoryboard()
}
func configureViewForStoryboard() {
if let nibView = NSBundle(forClass: self.dynamicType).loadNibNamed("\(self.dynamicType)", owner: self, options: nil).first as? UIView {
view = nibView
} else {
Log("Error loading view for storyboard preview. Couldn't find view named \(self.dynamicType)")
view = UIView()
}
view.frame = bounds
view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
backgroundColor = .clearColor()
addSubview(view)
}
}
Вот мой подкласс StackedButton
:
class StackedButton: DesignableControl {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var imageViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var imageViewWidthConstraint: NSLayoutConstraint!
@IBOutlet weak var label: UILabel!
...
}
Приведенный выше код работает и выглядит нормально, когда я запускаю приложение, однако, когда я просматриваю его в раскадровке, происходит сбой процесса Interface Builder с EXC_BAD_ACCESS
в следующей строке в DesignableControl
(выделено для ясности):
func configureViewForStoryboard() {
let bundle = NSBundle(forClass: self.dynamicType)
print("bundle: \(bundle)")
let nibArray = bundle.loadNibNamed("\(self.dynamicType)", owner: self, options: nil)
print("nibArray: \(nibArray)") //<-- EXC_BAD_ACCESS
...
}
Когда я впервые написал этот код, он работал, но, похоже, не работает в последней версии Xcode (7.2.1 на момент публикации). Что я делаю не так?
loadNobNamed(...)
возвращает ноль. Глупая мысль, но проверьте, чтоself.dynamicType
разрешается в одно и то же имя в обоих случаях. - person drekka   schedule 24.02.2016