IB DESIGNABLE, IBInspectable-конструктор интерфейса не обновляется

у меня есть следующий код:

CustomView.h

#import <UIKit/UIKit.h>

IB_DESIGNABLE
@interface CustomView : UIView

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

@end

CustomView.м

#import "CustomView.h"

@implementation CustomView

- (void)setBorderColor:(UIColor *)borderColor {
    _borderColor = borderColor;
    self.layer.borderColor = borderColor.CGColor;
}

- (void)setBorderWidth:(CGFloat)borderWidth {
    _borderWidth = borderWidth;
    self.layer.borderWidth = borderWidth;
}

- (void)setCornerRadius:(CGFloat)cornerRadius {
    _cornerRadius = cornerRadius;
    self.layer.cornerRadius = cornerRadius;
}

@end

(для справки Swift, эта проблема также возникает с кодом Swift)

CustomView.Свифт!--31-->
@IBDesignable
class CustomView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

    @IBInspectable var borderColor : UIColor = UIColor.clearColor() {
        didSet {
            self.layer.borderColor = borderColor.CGColor
        }
    }

    @IBInspectable var borderWidth : CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius : CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }
}

добавил UIView к контроллеру вида на раскадровке и установите его подкласс в CustomView.

enter image description here

это добавляет строку" Designables". Он застрял на "обновлении", и всплывающая подсказка говорит"ожидание цели для сборки". Он никогда не меняется от этого статуса.

когда я перехожу к атрибутам inspect, я могу установить эти IBInspectable свойства:

enter image description here

и после установки они также отображаются в "пользовательских атрибутах среды выполнения":

enter image description here

однако статус "Designables" никогда не выходит за рамки "обновления" с той же подсказкой (я пробовал Cmd+B здание несколько раз, ничего не меняется).

кроме того, как я поставил IBInspectable свойства, я получаю предупреждение для каждого из них:

IBDesignables - игнорирование определенного пользователем атрибута времени выполнения для ключевого пути " borderColor "на экземпляре" UIView"... этот класс не ключ-значение кодирования-совместимый для ключа необходимо.

скриншот предупреждения:

enter image description here


я знаком с проблемами, совместимыми с кодированием ключевых значений, и, как правило, знает, как их решить... но я не понимаю, как решить этот вопрос здесь. Согласно инспектору удостоверений представления, представление является " CustomView "(а не обычным" UIView", который не имеет этих свойств). И если представление не было "CustomView", то эти проектируемые свойства не будут отображаться в Инспекторе атрибутов, верно? Но когда Interface Builder пытается применить эти атрибуты к представлению, он возвращается к думая, что класс представления является "UIView" и не может применять атрибуты.

помочь? Пожалуйста, дайте мне знать, если я упустил какую-то важную деталь, но для чего это стоит, я следил за этим учебником точно (кроме ObjC vs Swift). Также стоит отметить, что я следил за этим уроком именно на другой машине, и он работал как шарм (я намеревался сделать этот пост прошлой ночью, но компьютер, на котором я был, тогда не имел этого вопрос.)


основываясь на комментариях, было высказано предположение, что, возможно,.m файл не включен, и это может вызвать проблему. Я думал, что, конечно, сделал бы все возможное, чтобы этот сценарий имел место, но я все равно проверил.

enter image description here

когда я впервые начал пытаться сделать это, я был под понимании, что IB_DESIGNABLE классы должны были быть частью другого UIKit основы. Итак, с этого первого скриншота, вы можете видеть, что я настроил фреймворк "CustomViews", который имеет один класс,CustomView. Вы также увидите здесь, что я также создал OtherView, который идентичен CustomView, за исключением того, что это не в отдельной структуре. Однако идентичная проблема сохраняется на раскадровке между обоими классами.

здесь у нас есть скриншот, указывая, что CustomView.m включено быть построенным с CustomViews основа:

enter image description here

между тем, следующие скриншот указывает на несколько вещей:

  • CustomViews.framework соответствующим образом включен в основной проект.
  • OtherView.m также включен в качестве источника компиляции, поэтому, даже если что-то не так с CustomView, OtherView должен работать, однако он генерирует идентичные ошибки.
  • Main.storyboard и LaunchScreen.xib отображаются как красные. Я понятия не имею почему, и не имею ни малейшего понятия почему!--20--> должны (я не трогал этот файл), хотя я могу сказать после глядя на другие проекты, Main.storyboard также отображается красным цветом для этих проектов, и я ничего не делаю с IB_DESIGNABLE или IBInspectable там.

enter image description here


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

оба компьютера Mac Minis приобрел новые в этом году (не новые модели, Модель конца 2012 года). На обоих компьютерах работает OS X Yosemite 10.10. Оба компьютера работают под управлением Xcode версии 6.1. Дома, сборка (6A1052d). Сегодня утром я могу подтвердить, что на обоих компьютерах выполняются идентичные сборки Xcode.

другие предположили мне, что это может быть плохой баран. Это кажется неправдоподобно. Я перезапустил проект несколько раз, перезапустил компьютер несколько раз. Мне кажется, если там были плохие ОЗУ на компьютере примерно 6 месяцев, что я буду видеть другие проблемы, и что эта проблема будет менее последовательной. Но эта точная проблема сохраняется, несмотря на многократный перезапуск всего проекта с нуля и полный перезапуск на компьютере.


стоит отметить, что если я действительно компилирую и запускаю этот проект, пользовательский вид с IBInspectable свойства на самом деле отображается, как я ожидаю, раскадровка для отображения его. Я представляю, что это будет иметь место даже без IB_DESIGNABLE и IBInspectable директивы, однако, поскольку они создаются как пользовательские атрибуты среды выполнения.

11 ответов


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

  • Автоматическое Обновление Просмотров
  • Обновить Все Вид

Я нажал "обновить все представления" , и после того, как Xcode немного подумал, внезапно раскадровка отображала мой вид, как ожидалось (правильно применяя мой IBInspectable свойства.)

enter image description here

затем я снова прошел весь процесс, чтобы подтвердить, что это решение.

Я создал новый класс ThirdView. Этот класс идентичен другим. Я изменил класс моего представления на ThirdView и получил что-то немного другое на этот раз:

enter image description here

нажав "показать" мне предупреждения:

enter image description here

новый на этот раз:

использование класса UIView для объекта с пользовательским классом, потому что класс ThirdView не существует.

Это не более полезно, чем то, что уже существовало. Кроме того, теперь остальные три предупреждения удвоились до 6.

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

тем не менее, до этого момента все, что я делал, было тем, чего я никогда не делал возился дома. Дома это просто работало. Поэтому я включил " автоматическое обновление представлений "и создал" FourthView " для тестирования-еще раз, идентичный первым трем.

после изменения класса представления на "FourthView" ярлык designables сказал "обновление" на короткий момент, а затем, наконец, сказал "до даты":

enter image description here

Итак, я проверил свой компьютер дома. "Автоматически обновлять представления" включается на компьютере, который всегда работал. Это было выключил компьютер, которого не было. Я даже не помню, как касался этого пункта меню. Я даже не могу точно сказать, существовал ли он до Xcode 6. Но именно этот вариант имел значение.


TL; DR, Если у вас такая же проблема, описанная в вопросе, убедитесь, что" автоматическое обновление представлений "включено (или вручную "обновить все представления", когда вам нужно обновить В IB):

enter image description here


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

// Doesn't show up in IB
@IBInspectable var includeLeftSection = true

// Shows now that it knows the type
@IBInspectable var includeLeftSection : Bool = true

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

выберите проблемную раскадровку / xib, где должны отображаться ваши пользовательские представления.

в области навигатор перейдите к навигатору отчетов в рабочей области/проекте XCode.

в меню редактора XCode нажмите (как упоминалось nhgrif) опцию" Обновить все представления". Это заставит IB запустить компиляцию для целой кучи вещей, которые вы, я уверен, не ожидать.

в навигаторе отчетов нажмите "по группам", чтобы отфильтровать содержимое и посмотреть раздел "построитель интерфейса". Вы увидите, что для загрузки пользовательского фреймворка IBDesignable views он будет компилировать множество вещей. Если любой из этих целей не компилируются, например (возможно, устаревшие) цели модульного тестирования (даже если они полностью не связаны с кодом, который загружает эти представления или раскадровку), тогда IB не сможет загрузить ваш файл DLL.

в моем случае IB попытался скомпилировать 8 целей, в том числе 4, где модульные тесты, которые не были обновлены с недавних изменений рефакторинга, над которыми мы работали.

большинство изменений/исправлений кода, которые я сделал, чтобы IB правильно загружал и отображал мои таможенные представления, где они не связаны или даже не связаны с этими классами, и никогда не загружал раскадровку в ходе выполнения этих модульных тестов. Тем не менее, IB зависел от компиляции всего рабочего пространства чтобы это сработало.


у меня было такое же предупреждение Ignoring user defined runtime attribute for key path .. хотя я абсолютно уверен, что не сделал ничего плохого с моим пользовательским классом IBDesignable view.

оказалось, в моем случае это связано с кешем Xcode.

rm -rf ~/Library/Developer/Xcode/DerivedData/*

очистить DerivedData и предупреждение исчезло.


Если кто-то еще столкнется с ошибкой, класс IB Designables не существует по той же причине, что и я. Главный ответ не был моей проблемой... но вот несколько связанная с этим проблема...

в исходном коде раскадровки скрыто свойство customModule.

например, у меня был класс ForwardArrow внутри отдельной структуры, который я случайно добавил к моей основной цели.

таким образом, XML для некоторых представлений закончился как customClass=" ForwardArrow "customModule= "MainTargetNameWasHere"

когда я удалил их из основной цели в сборке, раскадровка не обновила MainTargetNameWasHere до CustomViews, который является основой, где он был расположен, и начал давать, что никакой класс не нашел ошибку.

So TLDR; убедитесь, что если ваш IBDesignable находится в другой структуре, атрибут customModule xml в вашей раскадровке имеет правильное значение. И если его там нет вообще добавить он.

пример из моего источника:

<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUG-jc-2Ml" customClass="ForwardArrow" customModule="CustomViews">

Я лично решил эту проблему, используя кнопку " - " для удаления содержимого из моего инспектора идентификации. Когда вы удаляете пользовательские классы, изменяете содержимое в IB, а затем добавляете новый пользовательский класс, назначаемые элементы в инспекторе удостоверений не удаляются, и это вызвало у меня эту ошибку. Просто удалите все и перестройте. enter image description here


в качестве моего примера я использовал CheckboxButton via pod и графика флажка никогда не отображаются в раскадровке, в то время как я получил те же проблемы, описанные в вопросе здесь:

предупреждение: IB Designables: использование класса UIView для объекта с пользовательским классом, потому что класс CheckboxButton не существует

и

предупреждение: IB Designables: игнорирование определенного пользователем атрибута времени выполнения для ключевого пути " checkColor" на примере "UIView". Нажмите исключение при попытке установить его значение: [ setValue: forUndefinedKey:]: этот класс не соответствует кодированию ключевого значения для ключевого checkColor.

путь разрешил мою проблему был поставить модуль с именем CheckboxButton как показано ниже:

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


Я знаю, что это ответ, но вот еще один опыт.

У меня были некоторые проблемы, не связанные с этой проблемой, но в процессе я удалил @IBInspectable из vars в моем классе и удалил атрибуты из инспектора идентификации (alt-apple-3).

после исправления проблемы (кода) с компонентом я обновил все тонну раз, но по-прежнему никаких атрибутов в инспекторе идентификации.

в конце концов, я заметил, что они вернулись, но только в инспекторе атрибутов (alt-apple-4). Как только я добавил к ним значения, они снова появились в Identity inspector


ответ Дэйва Томаса выше дал мне (обратное) решение, когда не другие (производные данные, редактор > обновить) сделали, но для ясности в случае, если люди не уверены, где редактировать XML... тебе и не нужно!

  1. в файле раскадровки выберите хлопотный вид
  2. на правой боковой панели выберите вкладку Identity Inspector (3-й вариант слева).
  3. у вас будет свой пользовательский класс, который уже должен быть набор и Module. Для меня это было пусто, и я получал те же ошибки, что и OP. Я установил Module мой название проекта и БАМ-он начал работать после восстановления!

Я только что прошел через звонок по этой проблеме. Я попробовал все перечисленные здесь и в других местах безрезультатно. Это раскадровка, которая отлично работала навсегда, и она внезапно перестала работать с атрибутом "игнорирование определяемого пользователем времени выполнения"..." проблема.

по какой-то причине удаление этого кода из одного из моих IBDesignable исправило его:

-(void)viewDidLoad {
    self.clipsToBounds = YES;
}

удаление этого вызвало исчезновение всех предупреждений, даже в других IBDesignable объектах. Я не знаю, почему этот один шаг исправил это, но, возможно, это поможет кому-то еще.


У меня была та же проблема, и мне пришлось изменить cornerRadius и BorderWidth, чтобы быть строкой, а затем бросить ее в CGFloat, это было единственное решение для меня, чтобы иметь возможность изменять значения и видеть изменения в interface builder.

@IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor!.CGColor
    }
}

@IBInspectable var borderWidth: String? {
    didSet {
        layer.borderWidth = CGFloat(Int(borderWidth!) ?? 0)
    }
}

@IBInspectable var cornerRadius: String? {
    didSet {
        layer.cornerRadius = CGFloat(Int(cornerRadius!) ?? 0)
        layer.masksToBounds = layer.cornerRadius > 0
    }
}