我一直在研究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"
}
@endDesignableLable是UILabel的子类。UILabels具有text属性。我想让SomeClass以某种方式设置这个属性。通常情况下,如果我这样做并运行应用程序,它应该显示字符串。然而,为了省去运行应用程序的麻烦,我希望它出现在界面构建器中,这样我就可以在输入时看到它的价值。
发布于 2015-04-14 18:02:09
我会回答我自己的问题,让其他人受益。可以使用用户定义的运行时属性调用类别方法,从外部设置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创建了两个类别。现在,如果我将两个UILabels放入故事板中的ViewController中,并将两个UILabel子类放到DesignableLabel中,那么对于第一个UILabel,我可以通过调用关键路径来使用用户定义的运行时属性
theText使用布尔值的类型并设置复选标记。然后,这个特定的DesignableLabel对象将在setTheText:分类方法中指定文本。
类似地,对于第二个DesignableLabel对象,可以通过调用键路径来使用用户定义的运行时属性。
myLittleFriend注意,键路径没有使用"set“这个词,它降低了第一个单词的大小写。setMyLittleFriend:变成myLittleFriend。
总之,这样可以避免为每个IB_DESIGNABLE对象创建一个子类。
发布于 2015-02-08 20:09:01
您希望在外部设置的公共属性(使用您的公共API)必须用IBInspectable关键字标记。例如:
@property (readwrite) IBInspectable BOOL activityIndicatorOn;您可以在苹果网站上找到关于这个关键字的更多信息。
https://stackoverflow.com/questions/28311003
复制相似问题