ios - IB_DESIGNABLE, IBInspectable -- 界面构建器不更新

标签 ios interface-builder ibdesignable ibinspectable

我有以下一组代码:

自定义 View .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

自定义 View .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 代码中)

自定义 View .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到 Storyboard上的 View Controller 并将其子类设置为 CustomView .

enter image description here

这将添加“Designables”行。它停留在“正在更新”上,工具提示显示“正在等待目标构建”。它永远不会从这个状态改变。

当我转到属性检查时,我可以设置这些 IBInspectable属性:

enter image description here

一旦设置,它们也会显示在“用户定义的运行时属性”中:

enter image description here

然而,“Designables”状态永远不会超过“更新”,工具提示仍然相同(我已经多次尝试 Cmd+B 构建,没有任何变化)。

此外,正如我设置的 IBInspectable属性,我收到每个警告:

IBDesignables - Ignoring user defined runtime attribute for key path "borderColor" on instance of "UIView" ... this class is not key-value coding-compliant for the key borderColor.



生成的警告截图:

enter image description here

我熟悉键值编码兼容问题,并且通常知道如何解决它们......但我不明白如何在这里解决这个问题。根据 View 的身份检查员, View 是“CustomView”(不是常规的“UIView”,它没有这些属性)。如果 View 不是“CustomView”,那么这些可设计的属性就不会显示在 Attributes Inspector 中,对吧?但是当 Interface Builder 尝试将这些属性应用于 View 时,它又回到认为 View 的类是“UIView”并且无法应用这些属性。

有什么帮助吗?如果我遗漏了一些重要的细节,请告诉我,但对于它的值(value),I followed this tutorial exactly (除了 ObjC 与 Swift)。还值得注意的是,我完全在另一台机器上遵循了本教程,它的效果非常好(我昨晚打算发布这篇文章,但当时我使用的计算机没有这个问题)。

根据评论,有人建议也许是 .m文件不包括在内,这可能会导致问题。我想我肯定会为这种情况而竭尽全力,但我还是检查了。

enter image description here

当我第一次开始尝试这样做时,我了解到 IB_DESIGNABLE类必须是不同 UIKit 的一部分框架。所以从第一张截图中,你可以看到我设置了一个“CustomViews”框架,它有一个类,CustomView .你还会在这里看到我还创建了一个 OtherView ,与 CustomView 相同,除非它不在一个单独的框架中。然而,两个类之间的 Storyboard上仍然存在相同的问题。

这里我们有一个截图表明 CustomView.m包含与 CustomViews 一起构建框架:

enter image description here

同时,以下屏幕截图表明了几件事:
  • CustomViews.framework适本地包含在主要项目中。
  • OtherView.m也作为编译源包含在内,所以即使 CustomView 有问题, OtherView应该可以工作,但是它会产生相同的错误。
  • Main.storyboardLaunchScreen.xib显示为红色。我不知道为什么,也不知道为什么 LaunchScreen.xib应该(我没接触过这个文件),虽然我看过其他项目后可以说,Main.storyboard这些项目也显示为红色,我没有对 IB_DESIGNABLE 做任何事情或 IBInspectable那里。

  • enter image description here

    我已经尝试并重试了几次。它每次都在我家里的电脑上运行——我在家无法重现这个问题中描述的问题。在工作中,它永远不会奏效。这个问题描述的问题每次都会发生。

    这两台电脑都是今年新购买的 Mac Mini(不是新型号,2012 年末型号)。两台计算机都运行 OS X Yosemite 10.10。两台计算机都运行 Xcode 6.1 版。在家里,版本是 (6A1052d)。今天早上,我可以确认两台计算机都运行相同版本的 Xcode。

    其他人向我建议它可能是坏 RAM。这对我来说似乎有些牵强。我已经多次重新启动项目,多次重新启动计算机。在我看来,如果大约 6 个月大的计算机上的 RAM 不好,我就会看到其他问题,并且这个问题会不太一致。但是,尽管无数次从头开始重新启动整个项目并在计算机上完全重新启动,但这个确切的问题仍然存在。

    值得注意的是,如果我实际编译并运行这个项目,自定义 View 带有 IBInspectable属性实际上显示为我期望 Storyboard显示它。我想即使没有 IB_DESIGNABLE 也会是这种情况。和 IBInspectable然而,指令是作为用户定义的运行时属性创建的。

    最佳答案

    根据 chrisco 对调试所选 View 的建议(我已经完成了,但为了更好的衡量而再试一次),我注意到编辑器菜单底部有几个其他选项。

  • 自动刷新 View
  • 刷新所有 View

  • 我点击了“刷新所有 View ”,在 Xcode 稍微思考了一下之后, Storyboard突然按预期显示了我的 View (正确应用了我的 IBInspectable 属性)。

    enter image description here

    然后我再次经历了整个过程以确认这是解决方案。

    我创建了一个新类,ThirdView .这个类与其他类相同。我将 View 的类更改为 ThirdView这次有点不同:

    enter image description here

    点击“显示”给我看警告:

    enter image description here

    这次是新的:

    Using class UIView for object with custom class because the class ThirdView does not exist.



    这实际上并不比已经存在的更有帮助。另外,现在其他三个警告奇怪地翻了一番,变成了 6 个。

    无论如何,如果我再次从编辑器下拉菜单中单击“刷新所有 View ”,所有错误都会消失,并且 View 再次正确显示。

    尽管如此,到目前为止,我所做的一切都是我在家里从未做过的事情。在家里,它只是有效。所以我打开了“自动刷新 View ”并创建了一个“FourthView”来测试——再次,与前三个相同。

    将 View 的类更改为“FourthView”后,designables 标签短暂显示“更新”,然后最后说“最新”:

    enter image description here

    所以,我在家里检查了我的电脑。在一直工作的计算机上打开了“自动刷新 View ”。它在不是的计算机上被关闭。我不记得触摸过这个菜单选项。我什至不能确定它在 Xcode 6 之前是否存在。但这个选项是造成差异的原因。

    TL; DR,如果您遇到问题中描述的相同问题,请确保“自动刷新 View ”已打开(或在 IB 中需要更新时手动“刷新所有 View ”):

    enter image description here

    关于ios - IB_DESIGNABLE, IBInspectable -- 界面构建器不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674111/

    相关文章:

    ios - 当另一个属性的数量增加时生成更多属性

    ios - Swift @IBDesignable - @IBInspectable 多变量

    ios - 处理 iOS 上 Core Data 数据库的频繁更新和请求的最佳实践?

    ios - RealmSwift 初始值设定项 - Xcode 修复它一直出错

    ios - 替换界面生成器中的 View 元素

    带有 NIB 文件的 iOS UIView 子类不显示 IB 中设计的 UI

    cocoa - 单击按钮时未调用 IBAction

    interface-builder - 未能呈现 ClassName : The agent threw an exception loading nib in bundle 的实例

    ios - Cocos2d : Stick two CCSprite?

    ios - 图像未显示在 Apple Watch 上