@IBDesignable crashing agent
когда я пишу UIButton-расширенный класс и сделать его @IBDesignable, Я получаю две ошибки в Interface Builder, а именно:
- Главная.раскадровка: ошибка: IB Designables: не удалось обновить статус автоматической компоновки: агент разбился, потому что FD закрыт
- Главная.раскадровка: ошибка: IB Designables: не удалось отобразить экземпляр RandjeUIButton: агент разбился
вот мой код:
import UIKit
@IBDesignable
class RandjeUIButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.backgroundColor = UIColor.blackColor()
}
}
Я работаю в Xcode 7 beta 2 на ОС X 10.11 beta 2. (Работает в виртуальной машине)
9 ответов:
конструктор интерфейса Xcode требует, чтобы вы реализовали и или ни инициализаторы для
@IBDesignableклассы для правильной визуализации В IB.если вы реализуете
required init(coder aDecoder: NSCoder)вам нужно будет переопределитьinit(frame: CGRect)а также, в противном случае" агент рухнет", как видно из ошибок, вызванных Xcode.для этого добавьте в класс следующий код:
override init(frame: CGRect) { super.init(frame: frame) }
Я встречал такую же проблему и решил ее таким образом:
- Проблема:
ошибка: IB Designables: не удалось обновить статус автоматической компоновки: агент разбился
- найдите кнопку отладки в файле проверки и нажмите на нее.
тогда Xcode скажет вам, где находится пролем. В моем случае я роняю
IBDesignableперед классом.Затем Я очистите и перестройте его, ошибка исчезла
в Xcode 7.3 ни одно из вышеперечисленных решений не работало для меня, но принятый ответ на этот вопрос сделал:не удалось отобразить экземпляр IB Designables
- очистить Xcode производные данные для проекта. Они находятся в ~ / Library / Developer / Xcode / DerivedData
- очистите текущую сборку, нажав ⌘ ⇧k
- создайте свой проект
- в раскадровке перейдите в меню редактора и обновите все представления; дождитесь сборки завершено и ошибки должны быть ушли
Мне не нужно делать 4-й шаг, чтобы решить проблему (и вам мой PaintCode-наследник UIView drawRect бы покрасить в раскадровке), включены здесь на всякий случай.
кредит @Mojtaba и @WeZZard
есть множество проблем, которые могут вызвать это. Запустите консоль и найдите отчет о сбое
IBDesignablesCocoaTouch...Я только что разобрался с проблемой с 3rd party designable, у которой были проблемы с
valueForKeyсемантика.
для меня, он не использовал
#if !TARGET_INTERFACE_BUILDERчто у меня. В основном у меня был некоторый код, который приведет к доступу к пути в моем пакете...Bundle.main.path(forResource: "Foo", ofType: "plist")проблема в том, что при запуске в IB (а не в вашем приложении),
Bundle.main- это не ваше приложение...(lldb) po Bundle.main NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)так что ответ на это просто пересмотреть ваш
@IBDesignable UIViewкод тщательно и использовать#if !TARGET_INTERFACE_BUILDERни за что (в моем случае звонитCoreLocationнапример) это не имеет смысла при запуске в дизайне время.как я отладил и нашел это
это то, что вы видите при использовании
Editor -> Debug Selected Viewпри выборе@IBDesignable UIViewв вашей раскадровке:вы будете врезаться в нужном месте
в моем случае, как видим
initXXXXделалassert, который был сбой во время разработки, потому что он искал значение в файле в моем Bundle-это Xcode, во время разработки.
вот как я решаю эту проблему:
- убедитесь, что розетки правильно инициализирован
- @IBInspectable свойства будут правильно инициализированы
- в файле xib нажмите на заполнитель владельца файла, перейдите в Инспектор идентификации, убедитесь, что у него нет значений по умолчанию
import UIKit @IBDesignable class TestView: UIView { @IBOutlet weak var label: UILabel! @IBInspectable var textLabel1: String? { get { return label.text } set { label.text = newValue } } // MARK: Setup var view1: UIView! var nibName: String = "TestView" override init(frame: CGRect) { super.init(frame: frame) xibSetup() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) xibSetup() } private func xibSetup() { view1 = loadViewFromNib() view1?.frame = self.bounds view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] if view1 != nil { addSubview(view1!) //textLabel1 = "ok" } } private func loadViewFromNib() -> UIView? { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: nibName, bundle: bundle) for object in nib.instantiateWithOwner(self, options: nil) { if let view: UIView = object as? UIView { return view } } return nil } }использование:
Я нашел что-то действительно важное при использовании UIImage в любом классе с пометкой @IBDesignable. Классический UIImage init приведет к краху агента:
let myImage = UIImage(named: String) // crash the agentрешение заключается в использовании этого метода инициализации UIImage:
let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)рабочий пример кода:
let appBundle = Bundle(for: type(of: self)) let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))где self-это ваш класс с ключевым словом @IBDesignable. Xcode 9.4, Swift 4.1




