Не удалось отобразить экземпляр ClassName: агент бросил исключение, загружая nib в пакет
Когда я включаю свой пользовательский вид IBDesignable в раскадровку или другой кончик, агент падает и выдает исключение, потому что он не может загрузить nib.
error: IB Designables: не удалось обновить статус автоматического макета: агент поднял исключение "NSInternalInconsistencyException": не удалось загрузить NIB в пакете: "NSBundle (загружен)" с именем "StripyView"
Вот код, который я использую для загрузки nib:
override init(frame: CGRect) {
super.init(frame: frame)
loadContentViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadContentViewFromNib()
}
func loadContentViewFromNib() {
let nib = UINib(nibName: String(StripyView), bundle: nil)
let views = nib.instantiateWithOwner(self, options: nil)
if let view = views.last as? UIView {
view.frame = bounds
view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
addSubview(view)
}
}
Представление загружается из nib правильно, когда я запускаю в симуляторе, почему он не будет отображаться в Interface Builder?
Ответы
Ответ 1
Когда Interface Builder отображает ваши представления IBDesignable
, он использует вспомогательное приложение для загрузки всего. Результатом этого является то, что mainBundle
во время разработки относится к вспомогательному приложению, а не к вашему приложению mainBundle
. Вы можете видеть, что путь, упомянутый в ошибке, не имеет ничего общего с вашим приложением:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays
При загрузке nib вы полагаетесь на то, что при выполнении bundle: nil
по умолчанию используется ваше приложение mainBundle
во время выполнения.
let nib = UINib(nibName: String(describing: StripyView.self), bundle: nil)
Поэтому вместо этого вам нужно передать правильный комплект. Закрепите указанную выше строку следующим образом:
let bundle = Bundle(for: StripyView.self)
let nib = UINib(nibName: String(describing: StripyView.self), bundle: bundle)
Это заставит Interface Builder загружать ваш nib из того же пакета, что и ваш пользовательский класс представления.
Это относится ко всему, что загружено из пакета вашим пользовательским представлением. Например, локализованные строки, изображения и т.д. Если вы используете их в своем представлении, убедитесь, что вы используете один и тот же подход и явно передаете пакет для класса пользовательского вида.
Ответ 2
Та же точка зрения с "Josh Heald", мы не можем передать nil для пакета. А также
это для тех, кто в объекте - C:
- (UIView *) loadViewFromNib{
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:bundle];
UIView *v = [[nib instantiateWithOwner:self options:nil]objectAtIndex:0];
return v;
}