我一直在研究IB_designable,这是一个非常棒的功能。但是,我遇到的一个问题是,对于每个视图,我必须为UIView创建子类。在该子类中,我必须在initWithCoder:方法和prepareForInterfaceBuilder中指定UI元素:
但是,我希望能够指定类的UI Elements OUTSIDE。
我想创建一个UIView子类,它具有我可以从外部设置的公共属性,并在Inter face builder中查看。
这可能吗?
更新:
我知道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的子类。 UILabels有一个文本属性。我希望SomeClass以某种方式设置该属性。通常如果我这样做并运行应用程序,它应该显示字符串。但是,为了省去运行应用程序的麻烦,我希望它显示在“界面”构建器中,这样我就可以在输入时看到它的值。
答案 0 :(得分:0)
您要在外部设置的公共媒体资源(使用公共API)必须使用IBInspectable
关键字进行标记。
例如:
@property (readwrite) IBInspectable BOOL activityIndicatorOn;
您可以在Apple's website上找到有关此关键字的更多信息。
答案 1 :(得分:0)
我会回答我自己的问题,以便其他人可以受益。您可以使用用户定义的运行时属性来调用类别方法,以从外部设置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放入故事板中的ViewController,并将UILabel子类化为DesignableLabel,那么对于第一个UILabel,我可以通过调用键路径来使用用户定义的运行时属性
theText
使用布尔类型并设置复选标记。然后,该特定的DesignableLabel对象将具有在setTheText:category方法中指定的文本。
类似地,对于第二个DesignableLabel对象,您将通过调用键路径来使用用户定义的运行时属性
myLittleFriend
请注意,关键路径不使用" set"它是第一个单词的小写。 setMyLittleFriend:成为myLittleFriend。
总之,这使您不必为每个IB_DESIGNABLE对象创建一个子类。