IB Designables: не удалось отобразить и обновить статус автомаркета

У меня есть пользовательское представление (xib), в котором есть UIButton, я сделал id IBDesignable следующим образом:

UserView.swift

import UIKit

@IBDesignable
class UserView: UIView {

    @IBOutlet var view: UIView!
    @IBOutlet weak var userButton: UIButton!

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

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        load()
    }

    fileprivate func load() {
        Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
        addSubview(view)
        self.frame = bounds
    }

}

UserView.xib

  • Добавил UIButton и установил ограничения
  • Установите владельца файла: UserView

Раскадровка

Я добавил UIView к элементу панели Bar Button Item и назначил класс UserView, но ничего не рендерится, и я получил следующую ошибку сборки:

ошибка: IB Designables: не удалось отобразить и обновить состояние автоматического макета для FoodViewController (bR3-Kz-wX7): агент выдал исключение.

Моя текущая среда: Xcode 9, Swift 4

Ответы

Ответ 1

Я добавляю этот скрипт в конец моего Podfile и снова выполняю pod install. Так что я мог нормально построить свой проект.

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end

Ответ 2

У меня была точно такая же проблема, и единственное, что сработало для меня, это вместо того, чтобы использовать основной комплект, который я должен был получить, чтобы получить комплект для нужного мне кончика. Существенно меняется:

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

Для того, чтобы:

let bundle = Bundle(for: UserView.self)
bundle.loadNibNamed("UserView", owner: self, options: nil)

Что странно, так как в моем случае при сравнении двух Пакетов во время выполнения в LLDB они были идентичны (имя класса отличается, но остальные мои настройки были идентичны OP)

lldb screenshot

Ответ 3

Xcode 9.3, CocoaPods 1.5.3 Это может быть связано с недавним обновлением версии CocoaPods. Смотрите проблему здесь.

У меня была эта ошибка. IB Designables: Failed to render and update auto layout status в раскадровке, класс STPPaymentCardTextField в Stripe SDK, связанный с Cocoapods.

Решение состоит в том, чтобы понизить ваши CocoaPods до 1.4.0.

sudo gem list cocoapods

sudo gem uninstall cocoapods

sudo gem install cocoapods -v 1.4.0

pod update

Ответ 4

Этот вопрос связан с этим ответом. Проверьте оба.
Не удалось отобразить экземпляр ClassName: агент бросил исключение, загружая nib в пакет

Нижняя линия

Убедитесь, что ваш xib файл не имеет осиных торговых точек. Проверьте каждый вид/элемент наконечника для розетки и удалите и снова добавьте.

Подвеска с выводом

Для меня они были сиротами. Кажется, что nibs и IB очень тонкие, и отладчик не дает много деталей... если вы не можете заставить это работать, вы можете начать с нового файла nib/xib.


Прохождение моего рабочего кода

Для решения этой проблемы потребовалось несколько дней. В интересах других я даю подробный ответ и показываю все мои соответствующие коды и подключения.

Рабочая операция, в которой я реализовал действие fix (выше), находится здесь: https://github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Версия Xcode 9.2

Моя файловая структура

Вот моя файловая структура (примечание: я создаю модуль с cocoapods с именем ZMAppFoundation. Кроме того, ZMPieTimerView.swift не относится к решению.):

введите описание изображения здесь

Я хочу, чтобы мой nib был доступен для просмотра (IBDesignable) в файле Main.storyboard. Вот владелец файла и пользовательский класс моего xib, ZMGauge.xib:

Владелец файла Пользовательский класс

Код, реализация

Вот мой класс ZMXibView:

//  Adapted from https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d

import UIKit

@IBDesignable
open class ZMXibView: UIView {


    var contentView:UIView?
    @IBInspectable var nibName:String?

    override open func awakeFromNib() {
        super.awakeFromNib()
        xibSetup()
    }

    func xibSetup() {
        guard let view = loadViewFromNib() else { return }
        view.frame = bounds
        view.autoresizingMask =
            [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        guard let nibName = nibName else { return nil }
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(
            withOwner: self,
            options: nil).first as? UIView
    }

    override open func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        xibSetup()
        contentView?.prepareForInterfaceBuilder()
    }
}

В раскадровке мой xib указан в пользовательском классе. Я использую cocoapods для разработки стручка. Я явно выбрал модуль. (Обратите внимание, что в моем классе XibView я должен определить свойство nibName.):

Настройка настраиваемого класса на xib

Не забывайте!

Затем вам может понадобиться очистить, закрыть Xcode, перестроить или просто подождать некоторое время, когда IB снова отобразит его. Для меня все еще остается загадкой, когда Xcode решит попробовать отобразить IBDesignables, и я не знаю, как это сделать.

Успех

Основываясь на моем коде и действиях, которые я взял, мой nib теперь доступен IBDesignable в моей Main.storyboard.

nib теперь доступен для просмотра

Если вы пропустили его

Если вы его пропустили, мое решение находится на самой вершине этой публикации. Я получил мою, чтобы очистить ошибку, процитированную OP, удалив некоторые потерянные IBOutlets.

Ответ 5

Для меня исправление сводилось к тому, чтобы заставить Interface Builder перерисовать объект. У меня было это в двух местах, и оба были исправлены без изменений кода, но симптомы ошибки агента и вид, пустой в раскадровке, в конечном итоге были исправлены.

Один из них был исправлен путем перетаскивания UIView в другой порядок в представлении и перестройке. Второе в таблице TableView с ячейкой Prototype было исправлено, выбрав TableView, изменив количество ячеек Prototype на два, подождите секунду, а затем измените их на один. TableView, который был белым пробелом, затем правильно нарисовал все элементы и ошибка агента исчезла.

Похоже, что это ошибка с IB и другими поисками, существует множество решений для аналогичной ошибки. Надеюсь, это поможет кому-то.

Ответ 6

(xCode 9.2, Swift 4) Следующие могут не помочь вашей конкретной проблеме, но могут помочь другим с очень похожей проблемой. Это была моя ошибка:

error: IB Designables: не удалось отобразить и обновить статус автоматического макета для CustomExampleView (XXXXX): агент разбился

Мне удалось удалить ошибку при удалении CustomExampleView.xib и CustomExampleView.swift. Чтобы реплицировать, я затем повторно создал файлы, перешел в .xib и установил пользовательский класс представления верхнего уровня в CustomExampleView.

My ошибка устанавливала пользовательский класс в представление верхнего уровня на .xib вместо настройки пользовательского класса в Владелец файла. После установки соответствующего пользовательского класса моя проблема была решена.

Ответ 7

Это проблема некоторых версий cocoa-бобов, таких как 1.5.0. Если вы используете этот, то это приводит к тому, что рендеринг не смог перейти от текущей версии к другой, запустите эту команду в терминале

sudo gem uninstall cocoapods

Вы можете установить любую конкретную версию, упомянув, как это

sudo gem install cocoapods -v 1.4.0

Надеюсь, это будет работать для вас.

Ответ 8

Для меня эта проблема решена,

  1. Обновление стручков.
  2. Изменение настройки сборки на "$ (наследуется)" для встроенной опции быстрых библиотек.
  3. Строительство, уборка, строительство.
  4. Закрытие проекта.
  5. Выход из Xcode.
  6. Бег снова.

хахаха старый хак :) Спасибо!

Ответ 9

    post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end

Ввод вышеуказанного кода в Podfile решает проблемы. Этот код просто отменяет требование подписи кода для установленной платформы через Cocoapods. Но, похоже, это ошибка в IBDesignable, поскольку при использовании ставок Xcode 10 я не получаю эту ошибку из-за новой системы сборки, встроенной в Xcode 10.

Ответ 11

Я не очень много знаю о причине этого, но я видел это пару раз, и каждый раз это исправлялось просто перезапуском xcode. Я думаю, что там, где все должны начать, и если это не сработает, вы можете попробовать другие предложенные ответы.

Ответ 12

Я удивляюсь, насколько глупо то, что выполнение того, что я собираюсь сказать вам, имеет значение, но вы можете попробовать удалить взломанный код из

override func prepareForInterfaceBuilder() {

и использовать только в

override func awakeFromNib() {

Я еще больше сжимаюсь, когда сообщаю о том, что возможно, что ваши изменения могут отражаться в раскадровке так, как вы этого хотите.

Вы можете идентифицировать код разрыва, закомментировав все строки и используя процесс исключения, чтобы определить линию разрыва.

Ответ 13

Я отключил "Вариации пользовательских качеств", и моя проблема была решена.