Помилка @IBDesignable: IB Designables: Не вдалося оновити статус автоматичного макета: Інтерфейс Builder Cocoa Touch Tool вийшов з ладу


157

У мене дуже простий підклас 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об’єкта в інспекторі ідентичності на PlaceholderTextViewя можу встановити Placeholderвластивість просто в інспекторі атрибутів. Код чудово працює під час роботи програми, але не відображає текст заповнювача у конструкторі інтерфейсів. Я також отримую такі неблокуючі помилки (я припускаю, що це не відображається під час проектування):

помилка: IB Designables: Не вдалося оновити статус автоматичного макета: Інтерфейс Builder Cocoa Touch Tool вийшов з ладу

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

Я не в змозі зрозуміти, що викликає ці помилки. Друга помилка не має жодного сенсу, оскільки я навіть не перекреслює drawRect (). Будь-які ідеї?


1
Я отримував цю помилку. Об'єкт працював чудово в тестовому проекті, але не в моєму головному проекті (в таблиці). Відповідно до developer.apple.com/library/mac/recipes/… , я вибрав Вибір редактора> Налагодження вибраних представлень. Потім я отримав "Не вдалося налагодити представлення даних" "Переконайтеся, що у вашій рамці є правильні параметри збірки для збирання для iOS." У Google нічого не з’явилося за цю помилку.
Метт

Відповіді:


238

Існують звіти про збої, що створюються при збої інструменту Interface Builder Cocoa Touch Tool. Тези розміщені в ~/Library/Logs/DiagnosticReportsі названі IBDesignablesAgentCocoaTouch_*.crash. У моєму випадку вони містили корисний слід стека, який визначив проблему в моєму коді.


1
Дякую! Це було дуже корисно! Де ви знайшли інформацію про звіти про збої? :)
Ben-G

57
У моєму випадку я виявив, що це initFrame(frame: CGRect)необхідно визначити. Зробіть це, якщо ви надаєте власні initметоди.
Тревіс

Це було найкращим рішенням. Я не був реалізацією initWithFrame в одному з поглядів.
HotFudgeSunday

3
Я використовував діагностичні звіти і, як згадується @Travis, мені потрібно було init(frame: CGRect)явно переосмислити, оскільки у мене був власний iniметод. Ви можете ознайомитись зі звітом про збій, який знаходиться use of unimplemented initializer 'init(frame:)'безпосередньо під Application Specific Informationзвіт. Спасибі, хлопці! Подвійна перемога в цій відповіді!
Кріс

4
Як завжди, цей файл журналу також доступний у додатку Console macOS у групі " Діагностичні звіти користувача ".
Пауло Маттос

51

У мене було кілька разів те саме питання. Обидва рази це починалося, коли я завантажував ручку IBDesignable на дошку, коли ручка не змогла поміститися на вигляд (тобто у мене була кнопка від UIView, але все ще в ручці). Після того, як я виправив, що Xcode все-таки дав мені помилки, тому я перезапустив Xcode, поки він випадково не перестав давати мені помилку.

Я сподіваюся, що це допомагає.

ОНОВЛЕННЯ: Я щойно вбив усі процеси під назвою "Інтерфейс Builder Cocoa Touch Tool", перезапустив Xcode і помилка пішла. Не знаю, чи завжди це спрацює чи ні.


2
Хоча я досі не розумію, чому, якщо ви не перезаписуєте жоден із initметодів, у коді, розміщеному як частина питання, більше не відображаються IB Designablesпомилки, і заповнювач заповнення належним чином відображається в Інтерфейсі.
Віллінгтон Вега

2
Можливо, це помилка, і нам просто потрібно дочекатися її виправлення. Можливо, у Xcode 6.3.
Юссеф Мовад

3
XCode 7.1.1 і все ще присутній. Перезапуск XCode не вирішив проблему. Мені довелося вручну знищити всі процеси під назвою Interface Builder Cocoa Touch Tool, тоді XCode вийшов з ладу, перезапустив його і він почав працювати.
Крістіан Пена

1
Важливий момент: Дійсно ПЕРШЕ вбийте процеси
побудови

2
XCode 8.1 ця помилка все-таки виникає. Спочатку спричинено тим, що не було ініціальної переоцінки, але зберігалася після додавання init. Довелося вбивати процеси Interface Builder, як описано ТОГО перезапустити xcode, як говорить @TheEye
Джон Фоулер

39

У моєму випадку я робив наступний метод initWithFrame / initWithCoder для створення представлення:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Схоже, я не повинен був використовувати основний пакет , а замість цього класу. Тому я замінив цей код на наступне, і він спрацював:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

Я думав, може, це може комусь допомогти.


1
Це вирішило і мою проблему! Дякую @jmoukel!
edopelawi

Це вирішило мою проблему. Людина !!! Я не міг помітити цю лінію "bundleForClass", хоча я кілька разів заглядав у це рішення. :(
elk_cloner

let bundle = Bundle(for: ValidatingTextField.self)у
Свіфті

14

Ви можете вибрати свій власний вид в Interface Builder , а потім використовувати Editor, Debug Selected Views. Він запустить так званий IBDesignableAgentCocoaTouchсеанс налагодження, коли працюватимуть усі точки пробою (включаючи точки виключення), і ви зможете точно визначити місце збоїв у вашому огляді.


Ідеально! Це виявило і мою проблему - неправильний шрифт. Що пояснює, чому тільки один із шести дуже схожих IBDesignables вийшов з ладу.
zkarj

13

Для 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()
    }
}

@DungTran З яким питанням ви стикаєтесь?
Мохаммед Заїд Патхан

1
Додаткове поводження запобігає аварії. Але чи знаєте ви, що змушує UIImage (з ім'ям :) послідовно повертати нуль?
ScottyBlades

Коментуючи цей код, виправили його для мене `@objc @available (*, устарений, перейменований:" backgroundColor ") @IBIpepectable public var signatureBackgroundColor: UIColor = .white {didSet {backgroundColor = підписBackgroundColor}}`
PhoneyDeveloper

9

У мене виникли подібні проблеми з програмою Interface Builder, що відображає символи.

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

Збій рендерінгу

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

Немає аварійного відтворення

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

Ти герой.
nathangitter

Будь-яка ідея, чому літерали зображення несумісні з ІБ? У мене було те саме питання.
SwiftsNamesake

6

Насправді, якщо у вас є деякі старі визначені користувачем атрибути (які не дійсні для поточного перегляду) на будь-якому вікні вашої дошки, це може спричинити збій вашого агента.

Крім того, іноді це трапляється саме через неприємну помилку Xcode. Щоб перевірити це, коли ви знаходитесь на табло, зніміть прапорець "Редактор"> "Автоматично оновити перегляди", потім перейдіть до іншого файлу, очистіть і перезапустіть проект. Після того, як ви знову ввійшли в раскадровку, ви можете натиснути Редактор> Оновити перегляди та знову перевірити автоматичну. Це теж одного разу вирішило мою проблему.

Якщо обоє не спрацювали, то, ймовірно, ви зробили щось не так у своєму представленні IBDesignable, тому виберіть свої збійні представлення у дошці та налагодження, натиснувши Редактор> Перегляди налагодження


Ти - дар від Бога.
andrewcar

4

Це питання не стосується цього питання, але, можливо, я допоможу комусь іншому.

У мене була схожа проблема, коли в моєму класі @IBDesignable я не реалізував обох:

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

    // custom setup
}

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

    // custom setup
}

Ви завжди повинні реалізовувати обидва методи init. Init з фреймом використовується, коли ви відкриваєте свій погляд з коду, а init з aDecoder використовується від InterfaceBuilder.
Skodik.o

4

У мене була така ж проблема, і я вирішив її, додавши "use_frameworks!" до Podfile мого проекту.

Сподіваюся, це допоможе вам.


Це спрацювало для мене, коли у мене була ця проблема з JVFloatLabeledTextField
saswanb

Це для мене спрацювало, прийнявши старіший проект Obj-C, який був досить застарілим. ІБ світиться, як ялинка після цього! Дякую.
малював ..

3

У моєму випадку це якимось чином було пов’язане з каркасними рамками, якими я користувався. Я повинен додати $ (project_dir) / Carthage / Додавання / IOS для Runpath пошуку Контури установки збірки


Після спробу всіх інших розміщених рішень ... це було єдиним виправленням, яке працювало на мене! Дякую!
Джоель

3

У моєму випадку це була проблема з OneSignal. Мабуть, вони мають помилку у версії 2.2.0 і вище. Переключено на 2.1.6, і знову все чудово!

Перевірте це .


1

Коли я налагодив це, я дізнався, що існують деякі класи, які змінюють інтерфейс користувача. Зазвичай маркіруючий позначення - це підклас UILabel або будь-який інший підкласинг класу UIView та малювання ui під час виконання та зіткнення з двигуном Autolayout. Спробуйте надати фіксовану ширину або висоту для цих спеціальних представлень. Якщо це не вирішує вашу проблему, спробуйте наступні рішення: -

Рішення 1: - Відмініть #use_frameworks всередині вашого файла файлу.

Рішення 2: - Спробуйте видалити отримані дані. 1. Закрийте вікно "Редактор" вашого Xcode і вийдіть із симулятора -> 2. Перейдіть до Налаштування Xcode -> Locations -> 3. Клацніть маленьку сіру стрілку, яка показує отриманий шлях даних -> 4. Виберіть проект -> 5. Видаліть усі папки всередині -> 6. Закрийте Xcode і знову відкрийте


1

Додайте його в нижню частину свого 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

Додайте цей сценарій наприкінці мого 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

Основна проблема, коли ви створюєте @ IBDesignable, переконайтеся, що файл cocoapod не включений до UITests або інакше це спричинить цю аварію.


0

Я вважаю, що ваша xib має не той же розмір, що і дизайн у розкадровці. Переконайтесь, що xib має однакову висоту та ширину.


0

Мені просто не вистачало цього рядка коду platform :ios, '7.0' і проблема була вирішена. Тільки цей рядок у вашому файлі стручка та оновлення проблеми з його поділом буде вирішено.


0

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


0

Це як якщо ви отримали код від іншого розробника, і ви отримаєте цю помилку. Просто біжи

pod install

Це працювало для мене. Сподіваюся, що це допомагає.


0

Переконайтеся, що ви безпосередньо не ініціалізуєте 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
}

-1

Просто дозвольте йому створити та запустити на тренажері, якщо у вас є помилка в іншому місці в проекті, просто прокоментуйте це та запустіть позначуваний перший, щоб оновити позначувані та скасувати інші коди. Це працює для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.