@IBDesignable error: IB Designables: не удалось обновить статус автоматического макета: Interface Builder Cocoa Touch Tool разбился
У меня есть очень простой подкласс UITextView, который добавляет функциональность "Заполнитель", которую вы можете найти в качестве объекта в текстовом поле. Вот мой код для подкласса:
import UIKit
import Foundation
@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
@IBInspectable var placeholder: String = "" {
didSet {
setPlaceholderText()
}
}
private let placeholderColor: UIColor = UIColor.lightGrayColor()
private var textColorCache: UIColor!
override init(frame: CGRect) {
super.init(frame: frame)
self.delegate = self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidBeginEditing(textView: UITextView) {
if textView.text == placeholder {
textView.text = ""
textView.textColor = textColorCache
}
}
func textViewDidEndEditing(textView: UITextView) {
if textView.text == "" && placeholder != "" {
setPlaceholderText()
}
}
func setPlaceholderText() {
if placeholder != "" {
if textColorCache == nil { textColorCache = self.textColor }
self.textColor = placeholderColor
self.text = placeholder
}
}
}
После изменения класса для объекта UITextView
в Identity Inspector на PlaceholderTextView
, я могу установить свойство Placeholder
как можно точнее в Инспекторе атрибутов. Код отлично работает при запуске приложения, но не отображает текст заполнителя в построителе интерфейса. Я также получаю следующие неблокирующие ошибки (я полагаю, поэтому это не рендеринг во время разработки):
error: IB Designables: не удалось обновить статус автоматического макета: Interface Builder Cocoa Аварийный инструмент Touch Tool
error: IB Designables: Не удалось отобразить экземпляр PlaceholderTextView: рендеринг представления занял более 200 мс. Ваш код рисования может пострадать от низкой производительности.
Я не могу понять, что вызывает эти ошибки. Вторая ошибка не имеет никакого смысла, поскольку я даже не переопределяю drawRect(). Любые идеи?
Ответы
Ответ 1
Появляются отчеты о сбоях, возникающие при сбое интерфейса Builder Cocoa Touch Tool. Тезисы находятся в ~/Library/Logs/DiagnosticReports
и называются IBDesignablesAgentCocoaTouch_*.crash
. В моем случае они содержали полезную трассировку стека, которая идентифицировала проблему в моем коде.
Ответ 2
У меня была такая же проблема пару раз. Оба раза это начиналось, когда я загружал перо IBDesignable на раскадровку, когда перо не могло поместиться на виде (т.е. У меня была кнопка с UIView, но все еще в кончике). Как только я исправил этот Xcode, он по-прежнему выдавал мне ошибки, поэтому я перезапускал Xcode, пока он случайно не перестал выдавать мне ошибку.
Надеюсь, это поможет.
ОБНОВЛЕНИЕ: я просто убил все процессы, названные "Интерфейсный Разработчик Cocoa Touch Tool", перезапустил XCode, и ошибка исчезла. Не знаю, будет ли это всегда работать или нет.
Ответ 3
В моем случае я делал следующее в методах initWithFrame/initWithCoder для создания представления:
className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
Похоже, что я был Not, предположительно использующим Main Bundle, но вместо этого набор класса. Поэтому я заменил этот код следующим и работал:
bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];
Я подумал, может быть, это может помочь кому-то.
Ответ 4
Вы можете выбрать свое пользовательское представление в Interface Builder, а затем использовать
Editor
, Debug Selected Views
. Он запустит так называемый отладочный сеанс IBDesignableAgentCocoaTouch
, когда все точки останова (включая контрольные точки исключений) работают, и вы можете точно определить место, где сбой вашего вида.
Ответ 5
Для Xcode 8 - Swift
Добавление необязательного значения в качестве значения по умолчанию для @IBInspectable
вызывает у меня проблему.
Это не сработает:
@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
didSet {
// configureView
}
}
Это должно работать:
@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
didSet {
// configureView()
}
}
class func getDefaultImage() -> UIImage {
if let defaultImage = UIImage(named: "myImage") {
return defaultImage
} else {
return UIImage()
}
}
Ответ 6
Я столкнулся с аналогичными конструкторами интерфейса Builder.
Используя метод, предложенный в этом answer, я смог отследить проблему использования литералов изображений.
Рендеринг краха
self.backgroundImage.image = #imageLiteral(resourceName: "rectangleCenter")
Отказ от рендеринга
self.backgroundImage.image = UIImage(named: "rectangleCenter")
Ответ 7
На самом деле, если у вас есть какие-то старые пользовательские атрибуты (что недопустимо для текущего представления) в любом представлении в вашем раскадровке, это может привести к сбою вашего агента.
Кроме того, иногда это происходит только из-за неприятной ошибки Xcode. Чтобы проверить это, когда вы находитесь на раскадровке, снимите флажок "Редактор" > "Автоматическое обновление представлений", затем перейдите в другой файл, очистите и перезапустите проект. После того, как вы снова войдете в раскадровку, вы можете щелкнуть "Редактор" > "Обновить представления" и снова проверить автоматический. Одна из них также решила мою проблему.
Если оба не сработали, возможно, вы сделали что-то не так в своем представлении IBDesignable, поэтому выберите свои разбитые представления в раскадровке и отладке, нажав "Редактор" > "Отладочные представления"
Ответ 8
У меня была та же проблема, и я решил ее, добавив 'use_frameworks!' к моему проекту подфиле.
Надеюсь, это поможет вам.
Ответ 9
Это не относится к этому вопросу, но, возможно, я помогу кому-то другому.
У меня была аналогичная проблема, когда в моем классе @IBDesignable я не реализовал оба:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// custom setup
}
override init(frame: CGRect) {
super.init(frame: frame)
// custom setup
}
Ответ 10
В моем случае это было каким-то образом связано с картой, которую я использовал. Мне пришлось добавить $(PROJECT_DIR)/Carthage/Build/iOS в настройку сборки Путь к поиску путей
Ответ 11
В моем случае это была проблема с OneSignal. По-видимому, у них есть ошибка в версии 2.2.0 и выше. Переключился на 2.1.6, и все было здорово!
Отметьте это.
Ответ 12
Когда я отлаживал это, я узнал, что есть некоторые классы, которые изменяют пользовательский интерфейс. Обычно marquelabel, который является подклассом UILabel или любым другим классом, подклассифицирует UIView и рисует ui во время выполнения и сталкивается с движком Autolayout. Попробуйте указать фиксированную ширину или высоту для этих пользовательских представлений. Если это не решит вашу проблему, попробуйте следующие решения: -
Решение 1: - Раскомментируйте #use_framework внутри вашего файла подкачки.
Решение 2: - Попробуйте удалить производные данные. 1. Закройте окно редактора вашего Xcode и закройте симулятор → 2. Перейдите в Настройки Xcode → Местоположение → 3. Нажмите маленькую серо-стрелку, показывающую путь к производным данным → 4. Выберите свой проект → 5. Удалите все папки внутри → 6. Закройте Xcode и снова откройте
Ответ 13
Добавьте его в конец вашего Podfile и запустите pod install
# Workaround for Cocoapods issue #7606
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
Ответ 14
Добавьте этот скрипт в конец моего 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
Ответ 15
Основная проблема заключается в том, что при создании @IBDesignable убедитесь, что файл cocoapod не включен в UITests, иначе это вызовет этот сбой.
Ответ 16
Я нахожу, что причина в том, что ваш xib не такой же размер, как дизайн в раскадровке. Убедитесь, что xib имеет ту же высоту и ширину.
Ответ 17
Я просто пропустил эту строку кода platform :ios, '7.0'
и проблема была решена. Только эта строка в вашем файле pod и обновление вашей проблемы с пакетом будет устранена.
Ответ 18
Для меня это был отсутствующий сертификат подписи, потому что я никогда не запускал приложение, поэтому Xcode еще не создавал сертификат. После IBDesignable
приложения отрисовка IBDesignable
работала нормально.
Ответ 19
Это как если бы вы получили код от другого разработчика и получили эту ошибку. Просто беги
pod install
Это сработало для меня. Надеюсь, поможет.
Ответ 20
Убедитесь, что вы не инициализируете UIImage
или UIFont
используя ресурсы или шрифты, добавленные в ваш проект.
Я всегда создаю private func setUp()
в своих UI
классах пользовательского UI
@IBDesignable
. который вызывается из init(frame: CGRect)
, init?(coder aDecoder: NSCoder)
. Поэтому я наконец обновил setup()
следующим образом.
private func setUp() {
//... Doing initial configurations
// iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
if let icon = UIImage(named: "IconImageName") {
iconImageView.image = icon
iconImageView.frame.size = icon.size
}
// nameLabel.font = UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
if let font = UIFont(name: "Calibri-Light", size: size) {
nameLabel.font = font
} else {
nameLabel.font = UIFont.systemFont(ofSize: size)
}
// Doing other stuffs
}
Ответ 21
Просто позвольте ему создавать и запускать на симуляторе, если у вас есть ошибка в другом месте в проекте, просто прокомментируйте его и запустите в начале, чтобы обновить дизайн и раскомментировать другие коды.
Меня устраивает.