IB_designable 外部

Posted

技术标签:

【中文标题】IB_designable 外部【英文标题】:IB_designable externally 【发布时间】:2015-02-03 23:49:05 【问题描述】:

我一直在研究 IB_designable,这是一个非常棒的功能。但是,我遇到的一个问题是,对于每个视图,我都必须将 UIView 子类化。在该子类中,我必须在 initWithCoder: 方法和 prepareForInterfaceBuilder 中指定 UI 元素:

但是,我希望能够在类的外部指定 UI 元素。

我想创建一个 UIView 子类,它有一个公共属性,我可以从外部设置它并在界面生成器中查看。

这可能吗?

更新:

我知道 IBInspectible。这使得属性在属性检查器中可用。这不是我所说的外部。

IB_DESIGNABLE
@interface DesignableLabel : UILabel
@end
@implementation DesignableLabel 
@end

@interface SomeClass : UIViewController 
    IBOutlet DesignableLabel *DL;

@end
@interface SomeClass
- (void)prepareForInterfaceBuilder 
    DL.text = @"Hello World"

@end

DesignableLable 是 UILabel 的子类。 UILabel 有一个 text 属性。我希望 SomeClass 以某种方式设置该属性。通常,如果我这样做并运行应用程序,它应该显示字符串。但是,为了省去运行应用程序的麻烦,我希望它显示在 Interface builder 中,以便我可以在键入时看到它的值。

【问题讨论】:

【参考方案1】:

您要在外部设置的公共属性(使用您的公共 API)必须用 IBInspectable 关键字标记。 例如:

 @property (readwrite) IBInspectable BOOL activityIndicatorOn;

您可以在Apple's website 上找到有关此关键字的更多信息。

【讨论】:

这谈到了向属性检查器添加一个属性。那不是我真正要问的...请查看我的更新。希望它能澄清事情......【参考方案2】:

我会回答我自己的问题,以便其他人受益。您可以使用用户定义的运行时属性调用类别方法来从外部设置您的 IB_Designable 对象。

IB_DESIGNABLE
@interface DesignableLabel : UILabel
@end

@implementation DesignableLabel 
@end

@implementation DesignableLabel (Runtime_TheTextYouWant)
    - (void)setTheText:(BOOL)b 
        if (!b) return;
        self.text = "The text you want";
    
@end

@implementation DesignableLabel (Runtime_SayHelloToMyLittleFriend)
    - (void)setMyLittleFriend:(BOOL)b 
        if (!b) return;
        self.text = "Say hello to my little friend";
    
@end

我为我的 DesignableLabel 创建了两个类别。现在,如果我将两个 UILabel 放入 Storyboard 中的 ViewController 中,并将两个 UILabel 子类化为 DesignableLabel,那么对于第一个 UILabel,我可以通过调用键路径来使用用户定义的运行时属性

theText

使用布尔类型并设置复选标记。然后那个特定的 DesignableLabel 对象将具有 setTheText: 类别方法中指定的文本。

同样,对于第二个 DesignableLabel 对象,您将通过调用键路径来使用用户定义的运行时属性

myLittleFriend

请注意,关键路径不使用单词“set”,并且它的第一个单词小写。 setMyLittleFriend:变成myLittleFriend。

总之,这使您不必为每个 IB_DESIGNABLE 对象创建一个子类。

【讨论】:

以上是关于IB_designable 外部的主要内容,如果未能解决你的问题,请参考以下文章

IB_DESIGNABLE 使 Xcode 在离开情节提要时停止响应

Live Xcode 的 Interface Builder UIView 子类 (IB_DESIGNABLE) 没有 drawRect:

IB_DESIGNABLE 和 IBInspectable 的用法

Sse IBInspectable 和 IB_DESIGNABLE 错误更改未显示在情节提要中?

使用自动布局的 IB_DESIGNABLE 自定义视图的错位视图警告和奇怪行为

C++无法解析的外部命令和外部符号