Подтвердить что ты не робот

@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. (Запуск на виртуальной машине)

4b9b3361

Ответ 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: не удалось обновить статус автоматического макета: агент разбился

  1. Найдите кнопку отладки в файле проверки и щелкните по ней.

debug

  1. Затем Xcode сообщит вам, где находится пролем. В моем случае я бросаю IBDesignable перед классом.

  2. Затем я очищаю и перестраиваю его, ошибка исчезла

Ответ 3

В Xcode 7.3 ни один из вышеперечисленных решений не работал у меня, но принятый ответ на этот вопрос сделал: Не удалось отобразить экземпляр IB Designables

  • Очистить производные данные Xcode для проекта. Они находятся в ~/Library/Developer/Xcode/DerivedData​​li >
  • Очистите текущую сборку, нажав ⌘⇧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)