@IBDesignable аварийный агент
Когда я пишу свой собственный UIButton
-расширенный класс и делаю его @IBDesignable
, я получаю две ошибки в Interface Builder, а именно:
- Main.storyboard: ошибка: IB Designables: не удалось обновить статус автомакета: агент разбился, потому что fd закрыл
- Main.storyboard: error: 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 на OS X 10.11 beta 2. (Запуск на виртуальной машине)
Ответы
Ответ 1
Xcode Interface Builder требует, чтобы вы реализовали инициализаторы и или ни для классов @IBDesignable
для корректного отображения в IB.
Если вы реализуете required init(coder aDecoder: NSCoder)
, вам также нужно переопределить init(frame: CGRect)
, иначе "агент сработает", как видно из ошибок, вызванных Xcode.
Для этого добавьте следующий код в класс:
override init(frame: CGRect) {
super.init(frame: frame)
}
Ответ 2
Я встретил ту же проблему и решил ее так:
error: IB Designables: не удалось обновить статус автоматического макета: агент разбился
- Найдите кнопку отладки в файле проверки и щелкните по ней.
![debug]()
-
Затем Xcode сообщит вам, где находится пролем.
В моем случае я бросаю IBDesignable
перед классом.
-
Затем я очищаю и перестраиваю его, ошибка исчезла
Ответ 3
В Xcode 7.3 ни один из вышеперечисленных решений не работал у меня, но принятый ответ на этот вопрос сделал: Не удалось отобразить экземпляр IB Designables
- Очистить производные данные Xcode для проекта. Они находятся в ~/Library/Developer/Xcode/DerivedDatali >
- Очистите текущую сборку, нажав ⌘⇧K
- Создайте свой проект
- В раскадровке перейдите в меню "Редактор" и сделайте "Обновить все представления"; дождитесь завершения сборки и ошибок не должно быть.
Мне не нужно было делать 4-й шаг, чтобы решить проблему (и заставить мой PaintCode-drawRect'd UIView рисовать в раскадровке), включенный здесь на всякий случай.
Кредит @Mojtaba и @WeZZard
Ответ 4
Существует множество проблем, которые могут вызвать это. Запустите консоль и найдите отчет о сбое IBDesignablesCocoaTouch...
Я только что разобрался с проблемой со сторонним дизайном, у которого были проблемы с семантикой valueForKey
.
Ответ 5
Для меня это не использовало #if !TARGET_INTERFACE_BUILDER
которое получило меня. В основном у меня был некоторый код, который привел бы к доступу к пути в моем Bundle...
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
в раскадровке:
![This is what you see when using the <code>Editor -> Debug Selected View</code> while selecting your <code>@IBDesignable UIView</code> in your storyboard]()
Затем вы потерпите крах в нужном месте
![The Debug Navigator]()
В моем случае, как вы можете видеть, initXXXX
делал assert
, который initXXXX
во время разработки, потому что он искал значение в файле в моем Bundle, то есть Xcode, во время разработки.
Ответ 6
Просто заново откройте код в другой системе настройки Xcode. В моем случае это работало.
Ответ 7
Вот как я решаю эту проблему:
- Убедитесь, что розетки правильно инициализированы.
- @IBИнспективные свойства будут правильно инициализированы
- в файле 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
}
}
Ответ 8
Я нашел что-то действительно важное при использовании UIImage в любом классе, помеченном @IBDesignable. Классическая инициализация UIImage может привести к сбою агента:
let myImage = UIImage(named: String) // crash the agent
Решение состоит в том, чтобы использовать этот метод init 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
Ответ 9
Я потратил на это целый день и, наконец, решил свою проблему ![enter image description here]()
Я выбрал Build for target как 8.0, и он все исправляет для меня.
Ответ 10
XCode 10, Swift 4.2
Я нашел ответ здесь
Решение было простым - изменить способ разрешения пакета в required init?(coder aDecoder: NSCoder)
методе required init?(coder aDecoder: NSCoder)
моего пользовательского класса представления.
Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
необходимо изменить на
let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)