我有以下代码集:
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”状态永远不会超出具有相同工具提示的“更新”状态(我已经尝试过Cmd + B构建多次,没有任何变化)。
此外,在设置IBInspectable
属性时,我会为每个警告:
IBDesignables-忽略“ UIView”实例上键路径“ borderColor”的用户定义的运行时属性...此类与键borderColor的键值编码不兼容。
生成的警告的屏幕截图:
我熟悉与键值编码兼容的问题,并且通常知道如何解决这些问题...但是在这里我不了解如何解决此问题。根据视图的身份检查器,该视图是“ CustomView”(不是常规的“ UIView”,它不具有这些属性)。而且,如果视图不是“ CustomView”,那么这些可设计的属性将不会显示在“属性”检查器中,对吗?但是,当Interface Builder尝试将这些属性应用于视图时,可以回过头来以为视图的类是“ UIView”,并且无法应用这些属性。
有什么帮助吗?如果我遗漏了一些重要的细节,请让我知道,但是对于它的价值,我完全遵循了本教程(ObjC和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版本。
其他人向我建议,这可能是错误的RAM。这对我来说似乎很遥不可及。我已经多次重启了项目,多次重启了计算机。在我看来,如果大约6个月大的计算机上的RAM坏了,那我还会看到其他问题,并且这个问题的一致性会降低。但是,尽管无数次从头开始重新启动整个项目并在计算机上完全重新启动,但是这个确切的问题仍然存在。
值得注意的是,如果我实际编译并运行该项目,则带有IBInspectable
属性的自定义视图实际上会按照我希望情节提要显示的方式显示。我认为即使没有IB_DESIGNABLE
and IBInspectable
指令,情况也会如此,因为它们是作为用户定义的运行时属性创建的。