@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