У меня есть следующий набор кода:
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
, поскольку они создаются как определяемые пользователем атрибуты времени выполнения.