У мене є такий набір коду:
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
.
Це додає рядок "Дизайнерські". Він застряг на "Оновлення", а підказка говорить "Очікування побудови цілі". Це ніколи не змінюється від цього статусу.
Коли я переходжу до перевірки атрибутів, я можу встановити такі IBInspectable
властивості:
І після встановлення вони також відображаються в "Визначених користувачем атрибутах виконання":
Однак статус "Designables" ніколи не виходить за межі "Оновлення" за допомогою тієї ж підказки (я кілька разів пробував Cmd + B, нічого не змінюється).
Більше того, коли я встановлюю IBInspectable
властивості, я отримую попередження для кожного з них:
IBDesignables - ігнорування визначеного користувачем атрибута виконання для шляху ключа "borderColor" на екземплярі "UIView" ... цей клас не відповідає кодуванню значення-ключ для ключа borderColor.
Знімок екрана створених попереджень:
Я знайомий із проблемами, що відповідають кодуванню значення ключ-значення, і загалом знаю, як їх вирішити ... але я не розумію, як вирішити цю проблему тут. За даними інспектора ідентичності подання, подання є "CustomView" (а не звичайний "UIView", який не має цих властивостей). І якби подання не було "CustomView", то ці призначувані властивості не відображались би в Інспекторі атрибутів, так? Але коли Interface Builder намагається застосувати ці атрибути до подання, він повертається до думки, що клас представлення "UIView" і не може застосувати атрибути.
Будь-яка допомога? Будь ласка, дайте мені знати, якщо я залишив якусь важливу деталь, але для чого це варто, я точно дотримувався цього підручника (крім ObjC проти Swift). Варто також зазначити, що я дотримувався цього підручника точно на іншій машині, і це спрацювало як шарм (я мав намір зробити це повідомлення вчора ввечері, але на комп’ютері, на якому я тоді був, цієї проблеми не було).
На підставі коментарів було висловлено припущення, що, можливо, .m
файл не включений і це може спричинити проблему. Я подумав, що, напевно, не зміг би зробити цей сценарій, але все одно перевірив.
Коли я вперше намагався це зробити, я розумів, що IB_DESIGNABLE
заняття повинні бути частиною іншої UIKit
системи. Так що з першого екрану, ви можете бачити , що я створив основу «CustomViews», який має один клас, CustomView
. Ви також побачите тут, що я також створив a 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
and та IBInspectable
, оскільки вони створюються як визначені користувачем атрибути виконання.