@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 61

9 ответов:

конструктор интерфейса Xcode требует, чтобы вы реализовали и или ни инициализаторы для @IBDesignable классы для правильной визуализации В IB.

если вы реализуете required init(coder aDecoder: NSCoder) вам нужно будет переопределить init(frame: CGRect) а также, в противном случае" агент рухнет", как видно из ошибок, вызванных Xcode.

для этого добавьте в класс следующий код:

override init(frame: CGRect) {
    super.init(frame: frame)
}

Я встречал такую же проблему и решил ее таким образом:

  1. Проблема:

ошибка: IB Designables: не удалось обновить статус автоматической компоновки: агент разбился

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

debug

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

  2. Затем Я очистите и перестройте его, ошибка исчезла

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

  1. очистить Xcode производные данные для проекта. Они находятся в ~ / Library / Developer / Xcode / DerivedData
  2. очистите текущую сборку, нажав ⌘ ⇧k
  3. создайте свой проект
  4. в раскадровке перейдите в меню редактора и обновите все представления; дождитесь сборки завершено и ошибки должны быть ушли

Мне не нужно делать 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 в вашей раскадровке:

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, который был сбой во время разработки, потому что он искал значение в файле в моем Bundle-это Xcode, во время разработки.

просто повторно откройте код в другой системе установки 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
    }
    
    
}

использование:

enter image description here

Я нашел что-то действительно важное при использовании 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

Я потратил целый день на это и, наконец, я получил мою проблему решена enter image description here

Я выбрал Build для target как 8.0, и он исправляет все для меня.