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
Для меня эта проблема решена,
- Обновление стручков.
- Изменение настройки сборки на "$ (наследуется)" для встроенной опции быстрых библиотек.
- Строительство, уборка, строительство.
- Закрытие проекта.
- Выход из Xcode.
- Бег снова.
хахаха старый хак :) Спасибо!
Ответ 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.
Ответ 10
К сожалению, вы не можете использовать IBOutlets внутри IBDesignable. Лучший ответ для вас здесь:
Live Render Подключенные под IBOutlet субвью через объекты IBInspectable Properties
Возможно, вы хотели, чтобы ваш UserView расширил UIButton, а не UIView?
Ответ 11
Я не очень много знаю о причине этого, но я видел это пару раз, и каждый раз это исправлялось просто перезапуском xcode. Я думаю, что там, где все должны начать, и если это не сработает, вы можете попробовать другие предложенные ответы.
Ответ 12
Я удивляюсь, насколько глупо то, что выполнение того, что я собираюсь сказать вам, имеет значение, но вы можете попробовать удалить взломанный код из
override func prepareForInterfaceBuilder() {
и использовать только в
override func awakeFromNib() {
Я еще больше сжимаюсь, когда сообщаю о том, что возможно, что ваши изменения могут отражаться в раскадровке так, как вы этого хотите.
Вы можете идентифицировать код разрыва, закомментировав все строки и используя процесс исключения, чтобы определить линию разрыва.
Ответ 13
Я отключил "Вариации пользовательских качеств", и моя проблема была решена.