我有以下一组代码:
#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
#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 代码中)
@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”并且不能应用这些属性的想法。
有人帮忙吗?请让我知道,如果我遗漏了一些重要的细节,但为了它的价值,我完全遵循了这个教程(除了目标对斯威夫特)。同样值得注意的是,我在另一台机器上完全遵循了这个教程,而且效果非常好(我昨晚打算写这篇文章,但是我当时使用的电脑没有这个问题)。
根据注释,有人认为可能没有包含 .m
文件,这可能是导致问题的原因。我想我肯定会走出我的方式,为这种情况下,但我检查了无论如何。
当我第一次开始尝试这样做时,我的理解是 IB_DESIGNABLE
类必须是不同的 UIKit
框架的一部分。因此,从第一个屏幕快照中,您可以看到我设置了一个“ CustomView”框架,它有一个类 CustomView
。这里您还会看到我还创建了一个 OtherView
,它与 CustomView
相同,只是它不在一个单独的框架中。然而,相同的问题仍然存在于两个类之间的故事板上。
这里我们有一个屏幕截图,表明 CustomView.m
是包含在 CustomViews
框架中构建的:
同时,下面的截图显示了一些事情:
CustomViews.framework
适当地包含在主项目中。OtherView.m
也包含在编译源代码中,所以即使 CustomView
出了问题,OtherView
也应该可以工作,但是它会产生相同的错误。Main.storyboard
和 LaunchScreen.xib
显示为红色。我不知道为什么,也不知道为什么 LaunchScreen.xib
应该(我还没有碰过这个文件) ,虽然我可以说在看过其他项目之后,Main.storyboard
在这些项目中也显示为红色,我没有用 IB_DESIGNABLE
或 IBInspectable
做任何事情。我已经试了好几次了。它每次都能在我家里的电脑上工作——我不能在家里重现这个问题中描述的问题。工作的时候,从来不管用。这个问题中描述的问题每次都会发生。
这两台电脑都是 Mac Mini 今年新买的(不是新型号,是2012年底的型号)。两台电脑都运行 OS X Yosemite 10.10。两台计算机都运行 Xcode Version 6.1。在国内,建设是(6A1052d)。今天早上我可以确认两台电脑运行的是 Xcode 的相同版本。
其他人向我建议,它可能是坏的 RAM。这对我来说似乎有点牵强。我已经重新启动项目多次,重新启动计算机多次。在我看来,如果一台使用了大约6个月的计算机存储器存在问题,那么我就会看到其他问题,而且这个问题不会那么一致。但是,尽管无数次从头开始重新启动整个项目并在计算机上完全重新启动,这个问题仍然存在。
值得注意的是,如果我实际编译并运行这个项目,那么带有 IBInspectable
属性的自定义视图实际上显示为我期望的情节串连板显示的样子。我想即使没有 IB_DESIGNABLE
和 IBInspectable
指令,情况也是如此,因为它们是作为用户定义的运行时属性创建的。