У меня есть следующий набор кода:
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.m
#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.swift
@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.

Это добавляет строку «Designables». Он застрял на «Обновление», а во всплывающей подсказке написано «Ожидание сборки». Он никогда не меняется с этого статуса.
Когда я перехожу к проверке атрибутов, я могу установить следующие IBInspectableсвойства:

И после установки они также отображаются в «Пользовательских атрибутах времени выполнения»:

Однако статус «Designables» никогда не выходит за пределы «Updating» с той же подсказкой (я пробовал строить Cmd + B несколько раз, ничего не изменилось).
Более того, когда я устанавливаю IBInspectableсвойства, я получаю предупреждение для каждого из них:
IBDesignables - Игнорирование определенного пользователем атрибута времени выполнения для ключевого пути "borderColor" в экземпляре "UIView" ... этот класс не соответствует кодированию "ключ-значение" для ключевого borderColor.
Скриншот сгенерированных предупреждений:

Я знаком с проблемами, связанными с кодированием "ключ-значение", и в целом знаю, как их решать ... но я не понимаю, как решить эту проблему здесь. Согласно инспектору идентичности представления, представление является «CustomView» (а не обычным «UIView», у которого нет этих свойств). И если бы представление не было «CustomView», то эти настраиваемые свойства не отображались бы в инспекторе атрибутов, верно? Но когда Interface Builder пытается применить эти атрибуты к представлению, он снова начинает думать, что класс представления - «UIView», и не может применить атрибуты.
Любая помощь? Пожалуйста, дайте мне знать, если я упустил некоторые важные детали, но чего бы это ни стоило, я в точности следовал этому руководству (кроме ObjC vs Swift). Также стоит отметить, что я следовал этому руководству точно на другой машине, и он работал как шарм (я собирался опубликовать этот пост вчера вечером, но компьютер, на котором я был тогда, не имел этой проблемы).
На основании комментариев было высказано предположение, что, возможно, .mфайл не включен, и это может быть причиной проблемы. Я подумал, что, конечно, я бы изо всех сил старался реализовать этот сценарий, но все равно проверил.

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

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

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






