У меня есть следующий код:
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
}
}
}
Я добавил a UIView
в контроллер вида на раскадровке и установил свой подкласс в CustomView
.
Это добавляет строку "Designables". Он застрял в "Обновлении", и всплывающая подсказка говорит "Ожидание цели для сборки". Он никогда не изменяется от этого статуса.
Когда я перехожу к проверке атрибутов, я могу установить эти свойства IBInspectable
:
И как только они установлены, они также отображаются в "Пользовательских атрибутах времени выполнения":
Однако статус "Designables" никогда не выходит за рамки "Обновление" с помощью той же всплывающей подсказки (я несколько раз пробовал создание 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
, поскольку они создаются как атрибуты времени выполнения, определенные пользователем.