@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

Просто позвольте ему создавать и запускать на симуляторе, если у вас есть ошибка в другом месте в проекте, просто прокомментируйте его и запустите в начале, чтобы обновить дизайн и раскомментировать другие коды. Меня устраивает.