it-swarm.com.ru

@IBDesignable ошибка: IB Designables: не удалось обновить состояние автоматической разметки: разбился интерфейсный инструмент 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 в Attribute Inspector. Код отлично работает при запуске приложения, но не отображает текст заполнителя в конструкторе интерфейса. Я также получаю следующие неблокирующие ошибки (я полагаю, именно поэтому он не отображается во время разработки):

ошибка: IB Designables: не удалось обновить статус автоматического макета: Интерфейсный конструктор Cocoa Touch Tool потерпел крах

ошибка: IB Designables: не удалось отобразить экземпляр PlaceholderTextView: визуализация представления заняла более 200 мс. Ваш код рисования может страдать от низкой производительности.

Я не могу понять, что вызывает эти ошибки. Вторая ошибка не имеет никакого смысла, так как я даже не переопределяю drawRect (). Есть идеи?

149
Albert Bori

При сбое Интерфейсного Разработчика Cocoa Touch Tool создаются отчеты о сбоях. Тезисы расположены в ~/Library/Logs/DiagnosticReports и названы IBDesignablesAgentCocoaTouch_*.crash. В моем случае они содержали полезную трассировку стека, которая идентифицировала проблему в моем коде.

225
Petter

У меня была такая же проблема пару раз. Оба раза это начиналось, когда я загружал перо IBDesignable на раскадровку, когда перо не могло поместиться на виде (т. Е. У меня была кнопка с UIView, но все еще в кончике). Как только я исправил этот xCode, он по-прежнему выдавал мне ошибки, поэтому я перезапускал XCode до тех пор, пока он случайно не перестал выдавать ошибку. 

Надеюсь, это поможет.

ОБНОВЛЕНИЕ: Я только что убил все процессы, названные «Интерфейсный Разработчик Какао Touch Tool», перезапустил XCode, и ошибка исчезла. Не знаю, будет ли это всегда работать или нет.

50
Dustin Williams

В моем случае я делал следующее в методах 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];

Я подумала, может это кому-нибудь поможет.

38
jmoukel

Вы можете выбрать свой пользовательский вид в Интерфейсном Разработчике и затем использовать Editor, Debug Selected Views. Он запустит так называемый сеанс отладки IBDesignableAgentCocoaTouch, когда все точки останова (включая точки прерывания исключений) сработают, и вы сможете точно определить место падения вашего представления.

14
Fyodor Volchyok

Для XCode8 - 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()
        }
}
11
Zaid Pathan

Я сталкивался с подобными проблемами в Интерфейсном Разработчике, отрисовывающими дизайн.

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

Сбой рендеринга

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

Нет сбоя рендеринга

self.backgroundImage.image =  UIImage(named: "rectangleCenter")
9
Nick Cross

На самом деле, если у вас есть old определенные пользователем атрибуты (что недопустимо для текущего представления) в любом представлении вашей раскадровки, это может привести к сбою вашего агента. 

Кроме того, иногда это происходит только из-за неприятной ошибки Xcode. Чтобы это проверить, снимите флажок «Редактор»> «Автоматически обновлять представления», затем перейдите в другой файл, очистите и перезапустите проект. После того, как вы снова вошли в раскадровку, вы можете нажать «Редактор»> «Обновить представления» и снова проверить автоматический режим. Это тоже однажды решило мою проблему.

Если оба не сработали, то, возможно, вы сделали что-то не так с вашим представлением IBDesignable, поэтому выберите сбойные представления в раскадровке и выполните отладку, нажав «Редактор»> «Представления отладки».

6
Yusuf Kamil AK

Это не относится к этому вопросу, но, возможно, я помогу кому-то еще. 

У меня была похожая проблема, когда в моем классе @IBDesignable я не реализовал оба:

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

    // custom setup
}

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

    // custom setup
}
4
tzaloga

В моем случае это была проблема с OneSignal. Видимо, у них есть ошибка в версии 2.2.0 и выше. Перешел на 2.1.6 и все снова отлично!

Проверьте это .

3
Paul Berg

У меня была та же проблема, но я решил ее, добавив 'use_frameworks!' на PodFile.hope вашего проекта это может помочь вам.

3
Jimmy Ng

В моем случае это было как-то связано с каркасной структурой, которую я использовал. Мне пришлось добавить $ (PROJECT_DIR)/Carthage/Build/iOS в путь поиска Runpath build

3
AkademiksQc

Когда я отладил это, я обнаружил, что есть некоторые классы, которые модифицируют интерфейс. Обычно это маркированная метка, которая является подклассом UILabel или любого другого подкласса класса UIView и рисует пользовательский интерфейс во время выполнения и сталкивается с механизмом Autolayout. Попробуйте задать фиксированную ширину или высоту для этих пользовательских видов. Если это не решит вашу проблему, попробуйте следующие решения: -

Решение 1: - Раскомментируйте #use_frameworks внутри вашего файла pod.

Решение 2: - Попробуйте удалить производные данные. 1. Закройте окно редактора вашего XCode и выйдите из симулятора -> 2. Перейдите в «Настройки XCode» -> «Местоположения» -> 3. Нажмите маленькую серую стрелку, показывающую путь к производным данным -> 4. Выберите ваш проект -> 5. Удалите все папки внутри -> 6. Выйдите из Xcode и снова откройте

1
Ashish Pisey

Добавьте этот скрипт в конец моей 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
1
Haroldo Gondim

Добавьте его в конец вашего 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
1
Tissa

Основная проблема заключается в том, что при создании @ IBDesignable убедитесь, что файл cocoapod не включен в UITests, иначе это вызовет этот сбой.

1
Modesto Cabrera

Это как если бы вы получили код от другого разработчика и получили эту ошибку . Просто запустите 

pod install

Это сработало для меня. Надеюсь, это поможет.

0
Dhruv Khatri

Для меня это был отсутствующий сертификат подписи, потому что я никогда не запускал приложение, поэтому Xcode еще не создавал сертификат. После запуска приложения рендеринг IBDesignable работал нормально.

0
florianpfisterer

Я нахожу причину в том, что ваш xib не такого размера, как дизайн в раскадровке Убедитесь, что xib имеет одинаковую высоту и ширину. 

0
user6476366

Я просто пропустил эту строку кода platform :ios, '7.0' и проблема была решена. Только эта строка в вашем файле pod и обновление вашего pod проблема будет решена.

0
Shahzaib Maqbool

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

Я всегда создаю private func setUp() в моих @IBDesignable пользовательских UI классах ., Который вызывается из 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
}
0
Sauvik Dolui