2014-12-09 2 views
118

У меня есть очень простой подкласс UITextView, который добавляет функциональность «Заполнитель», которую вы можете найти, родной для объекта Text Field. Вот мой код для подкласса:@IBDesignable error: IB Designables: Не удалось обновить статус автомакета: Интерфейс Builder Cocoa Touch Tool разбился

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

error: IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed

error: IB Designables: Failed to render instance of PlaceholderTextView: Rendering the view took longer than 200 ms. Your drawing code may suffer from slow performance.

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

+0

я получаю эту ошибку. Объект отлично работал в тестовом проекте, но не в моем основном проекте (в таблице). Согласно https://developer.apple.com/library/mac/recipes/xcode_help-IB_objects_media/Chapters/DebuggingCustomViews.html#//apple_ref/doc/uid/TP40014224-CH42-SW1, я выбрал «Выбрать редактор»> «Отладка выбранных представлений» , Затем я получил «Не удалось отладить просмотры» «Убедитесь, что ваша инфраструктура имеет правильные настройки сборки для iOS». Ошибка Google в этой ошибке. – Matt

ответ

183

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

+1

Спасибо! Это было очень полезно! Где вы находили информацию об отчетах о сбоях? :) –

+0

'grep 'фатальная ошибка' ' – Travis

+37

В моем случае я обнаружил, что 'initFrame (frame: CGRect)' должен быть определен. Сделайте это, если вы предоставите свой собственный метод (init). – Travis

43

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

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

UPDATE: Я только что убил все процессы под названием «Интерфейс Builder Cocoa Touch Tool», перезапустил Xcode, и ошибка исчезла. Не знаю, будет ли это работать всегда или нет.

+0

Исповедь: она беспорядочно перестала выдавать мне ошибку, но с тех пор многое изменилось, и я не уверен, что заставило ошибку уйти. Двумя наиболее заметными изменениями являются: 1) Мы перестроили проект, чтобы использовать новые быстрые бобы для какао-ботов для загрузки в других быстрых рамках. 2) Я перестроил 'PlaceholderTextView', чтобы использовать метку subView вместо фактического значения текста ... Возможно, это была одна из этих вещей. –

+0

Обновление: ошибка вернулась, так же магически, как и она исчезла. –

+0

Имея эту ошибку, не знаю, как ее исправить. –

28

В моем случае, я делаю следующее в initWithFrame/initWithCoder методы, чтобы создать вид:

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

Похоже, я был Не предполагается использовать Главная Bundle, а вместо этого расслоение класса. Поэтому я заменил этот код для следующего, и она работала:

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

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

+0

Эта часть исправлена ​​моя проблема .... damn xcode :) – invoodoo

+1

Это исправило мою проблему тоже! Спасибо @jmoukel! – edopelawi

+0

Этот вопрос исправил мою проблему. Мужчина!!! я не мог заметить, что строка «bundleForClass», хотя я смотрел на это решение пару раз. ?!?! :( –

3

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

+0

'user_frameworks' или' 'use_frameworks –

+1

@ZonilyJame use_frameworks – AlessandroDP

+0

Это работает для меня, когда у меня был этот вопрос с JVFloatLabeledTextField – saswanb

9

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

+0

Очень полезный трюк, помогли решить мой случай – tzaloga

+0

Улучшите Это нашло мою проблему тоже.! - неправильный шрифт, что объясняет, почему сбой только одного из шести очень похожих IBDesignables. – zkarj

+0

человек, которого вы являетесь героем –

2

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

+0

После того, как вы попробовали все другие опубликованные решения ... это было единственное исправление, которое сработало для меня! Спасибо! – Joel

3

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

Отъезд this.

8

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

Грустный, но факт. .. – tzaloga

+0

Это не работает для меня :(Так грустно –

+0

@DungTran С какой проблемой вы сталкиваетесь? –

-1

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

0

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

2

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

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

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

    // custom setup 
} 

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

    // custom setup 
} 
+0

Вы всегда должны реализовывать оба метода init. Инициализация с фреймом используется при инициализации вашего представления из кода и init с использованием aDecoder от InterfaceBuilder. –

0

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

2

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

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

Если оба не работают, то, возможно, вы сделали что-то неправильно о вашем IBDesignable зрения, поэтому выбрать врезались виды в раскадровке и отладки, нажав редактора> Debug Просмотров

1

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

Решение 1: - Раскомментируйте #use_framework внутри вашего файла подкачки.

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

8

Я столкнулся с аналогичными конструкторами интерфейса, создающими конструкцию.

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

Rendering аварии

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

Нет рендеринга аварии

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

Вы герой. – nathan

+0

Любая идея, почему образные литералы несовместимы с IB? Я была такая же проблема. – SwiftsNamesake

Смежные вопросы