У меня есть очень простой подкласс 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 PlaceholderTextView
, я могу просто установить Placeholder
свойство в Инспекторе Атрибутов. Код прекрасно работает при запуске приложения, но не отображает текст заполнителя в конструкторе интерфейса. Я также получаю следующие неблокирующие ошибки (я полагаю, именно поэтому он не отображается во время разработки):
ошибка: IB Designables: не удалось обновить состояние автоматического макета: Интерфейсный конструктор Cocoa Touch Tool потерпел крах
ошибка: IB Designables: не удалось отобразить экземпляр PlaceholderTextView: визуализация представления заняла более 200 мс. Ваш код рисования может страдать от низкой производительности.
Я не могу понять, что является причиной этих ошибок. Вторая ошибка не имеет никакого смысла, так как я даже не переопределяю drawRect (). Любые идеи?
источник
Ответы:
При сбое Интерфейсного Разработчика Cocoa Touch Tool создаются отчеты о сбоях. Тезисы расположены
~/Library/Logs/DiagnosticReports
и названыIBDesignablesAgentCocoaTouch_*.crash
. В моем случае они содержали полезную трассировку стека, которая идентифицировала проблему в моем коде.источник
initFrame(frame: CGRect)
должен быть определен. Сделайте это, если вы предоставите свой собственныйinit
метод (ы).init(frame: CGRect)
явно переопределить, потому что у меня был собственныйini
метод. Возможно, вы захотите просмотреть отчет оuse of unimplemented initializer 'init(frame:)'
сбое непосредственноApplication Specific Information
в отчете. Спасибо, парни! Двойной выигрыш в этом ответе!У меня была такая же проблема пару раз. Оба раза это начиналось, когда я загружал перо IBDesignable на раскадровку, когда перо не могло поместиться на виде (то есть у меня была кнопка с UIView, но все еще в кончике). Как только я исправил этот Xcode, он по-прежнему выдавал мне ошибки, поэтому я перезапускал Xcode, пока он случайно не перестал выдавать мне ошибку.
Надеюсь, это поможет.
ОБНОВЛЕНИЕ: я только что убил все процессы, названные «Интерфейсный Разработчик Какао Touch Tool», перезапустил XCode, и ошибка исчезла. Не знаю, будет ли это всегда работать или нет.
источник
init
методов, код, размещенный как часть вопроса, больше не отображаетIB Designables
ошибки, и заполнитель правильно отображается в Интерфейсном Разработчике.В моем случае я делал следующее в методах initWithFrame / initWithCoder для создания представления:
Похоже, я не должен был использовать Main Bundle , а вместо этого связку класса. Поэтому я заменил этот код на следующий, и он работал:
Я подумал, что это может кому-нибудь помочь.
источник
let bundle = Bundle(for: ValidatingTextField.self)
в СвифтВы можете выбрать свой собственный вид в Interface Builder , а затем использовать
Editor
,Debug Selected Views
. Он запустит так называемыйIBDesignableAgentCocoaTouch
сеанс отладки, когда все точки останова (включая точки прерывания исключений) сработают, и вы сможете точно определить место, где происходит сбой вашего представления.источник
Для Xcode 8 - Swift
Добавление необязательного значения в качестве значения по умолчанию при
@IBInspectable
возникновении проблемы для меня.Это не сработает:
Это должно работать:
источник
Я сталкивался с подобными проблемами в Интерфейсном Разработчике, отрисовывающих дизайн.
Используя технику, предложенную в этом ответе, я смог отследить проблему до использования литералов изображений.
Сбой рендеринга
Нет сбоя рендеринга
источник
На самом деле, если у вас есть какие-то старые определенные пользователем атрибуты (которые не действительны для текущего представления) в любом представлении вашей раскадровки, это может привести к сбою вашего агента.
Кроме того, иногда это происходит только из-за неприятной ошибки Xcode. Чтобы это проверить, снимите флажок «Редактор»> «Автоматически обновлять представления», затем перейдите в другой файл, очистите и перезапустите проект. После того, как вы снова вошли в раскадровку, вы можете нажать «Редактор»> «Обновить представления» и снова проверить автоматический режим. Это тоже однажды решило мою проблему.
Если оба не сработали, то, вероятно, вы сделали что-то не так с вашим представлением IBDesignable, поэтому выберите сбойные представления в раскадровке и отладьте их, нажав «Редактор»> «Представления отладки».
источник
Это не относится к этому вопросу, но, возможно, я помогу кому-то еще.
У меня была похожая проблема, когда в моем классе @IBDesignable я не реализовал оба:
источник
У меня была та же проблема, и я решил ее, добавив 'use_frameworks!' в подфиле моего проекта.
Надеюсь, это поможет вам.
источник
В моем случае это было как-то связано с каркасным каркасом, который я использовал. Мне пришлось добавить $ (PROJECT_DIR) / Carthage / Build / iOS в настройку сборки Runpath Search Paths
источник
В моем случае это была проблема с OneSignal. Видимо, у них есть ошибка в версии 2.2.0 и выше. Перешел на 2.1.6 и все снова отлично!
Проверьте это .
источник
Когда я отладил это, я обнаружил, что есть некоторые классы, которые модифицируют интерфейс. Обычно это маркированная метка, которая является подклассом UILabel или любого другого подкласса класса UIView и рисует пользовательский интерфейс во время выполнения и сталкивается с движком Autolayout. Попробуйте задать фиксированную ширину или высоту для этих пользовательских видов. Если это не решит вашу проблему, попробуйте следующие решения: -
Решение 1: - Раскомментируйте #use_frameworks внутри вашего файла pod.
Решение 2: - Попробуйте удалить производные данные. 1. Закройте окно редактора вашего XCode и выйдите из симулятора -> 2. Перейдите в «Настройки XCode» -> «Местоположения» -> 3. Нажмите маленькую серую стрелку, показывающую путь к производным данным -> 4. Выберите ваш проект -> 5. Удалите все папки внутри -> 6. Выйдите из Xcode и снова откройте
источник
Добавьте его в конец вашего Podfile и запустите
pod install
источник
Добавьте этот скрипт в конец моего
Podfile
иpod install
снова выполните .источник
Основная проблема заключается в том, что при создании @ IBDesignable убедитесь, что файл cocoapod не включен в UITests, иначе это вызовет этот сбой.
источник
Я нахожу причину в том, что ваш xib не такого размера, как дизайн в раскадровке. Убедитесь, что xib имеет одинаковую высоту и ширину.
источник
Я просто пропустил эту строку кода,
platform :ios, '7.0'
и проблема была решена. Только эта строка в вашем файле pod и обновление вашего pod проблема будет решена.источник
Для меня это был отсутствующий сертификат подписи, потому что я никогда не запускал приложение, поэтому Xcode еще не создавал сертификат. Как только я запустил приложение,
IBDesignable
рендеринг работал нормально.источник
Это как если бы вы получили код от другого разработчика и получили эту ошибку. Просто беги
Это сработало для меня. Надеюсь, поможет.
источник
Убедитесь, что вы не инициализируете напрямую
UIImage
или неUIFont
используете ресурсы или шрифты, добавленные в ваш проект.Я всегда создаю
private func setUp()
в моих@IBDesignable
пользовательскихUI
классах. который вызывается изinit(frame: CGRect)
,init?(coder aDecoder: NSCoder)
. Поэтому я, наконец, обновилsetup()
следующее.источник
Просто позвольте ему создавать и запускать на симуляторе, если у вас есть ошибка где-то еще в проекте, просто закомментируйте его и сначала запустите designable, чтобы обновить designable и раскомментировать другие коды. Меня устраивает.
источник