IB_designable 外部
IB_designable externally
我一直在研究 IB_designable,这是一个非常棒的功能。但是,我遇到的一个问题是,对于每个视图,我都必须子classes 一个UI视图。在那个 Subclass 中,我必须在 initWithCoder: 方法和 prepareForInterfaceBuilder:
中指定 UI 元素
但是,我希望能够指定 class 之外的 UI 元素。
我想制作一个 UIView subclass,它有一个 public 属性,我可以从外部设置它并在 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 的子class。 UI标签有文本 属性。我希望 SomeClass 以某种方式设置 属性。通常如果我这样做并且 运行 应用程序,它应该显示字符串。但是,为了省去 运行 应用程序的麻烦,我希望它显示在界面生成器中,这样我就可以在输入时看到它的值。
您要在外部设置的 public 属性(使用您的 public API)必须用 IBInspectable
关键字标记。
例如:
@property (readwrite) IBInspectable BOOL activityIndicatorOn;
您可以在 Apple's website 上找到有关此关键字的更多信息。
我会回答我自己的问题,以便其他人受益。您可以使用用户定义的运行时属性调用类别方法来从外部设置您的 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
类型为boolean并设置复选标记。然后该特定的 DesignableLabel 对象将具有在 setTheText: 类别方法中指定的文本。
同样,对于第二个 DesignableLabel 对象,您可以通过调用键路径
使用用户定义的运行时属性
myLittleFriend
请注意,关键路径不使用单词 "set",而是将第一个单词小写。 setMyLittleFriend: 成为我的小朋友。
总而言之,这使您不必为每个 IB_DESIGNABLE 对象创建子类。
我一直在研究 IB_designable,这是一个非常棒的功能。但是,我遇到的一个问题是,对于每个视图,我都必须子classes 一个UI视图。在那个 Subclass 中,我必须在 initWithCoder: 方法和 prepareForInterfaceBuilder:
中指定 UI 元素但是,我希望能够指定 class 之外的 UI 元素。
我想制作一个 UIView subclass,它有一个 public 属性,我可以从外部设置它并在 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 的子class。 UI标签有文本 属性。我希望 SomeClass 以某种方式设置 属性。通常如果我这样做并且 运行 应用程序,它应该显示字符串。但是,为了省去 运行 应用程序的麻烦,我希望它显示在界面生成器中,这样我就可以在输入时看到它的值。
您要在外部设置的 public 属性(使用您的 public API)必须用 IBInspectable
关键字标记。
例如:
@property (readwrite) IBInspectable BOOL activityIndicatorOn;
您可以在 Apple's website 上找到有关此关键字的更多信息。
我会回答我自己的问题,以便其他人受益。您可以使用用户定义的运行时属性调用类别方法来从外部设置您的 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
类型为boolean并设置复选标记。然后该特定的 DesignableLabel 对象将具有在 setTheText: 类别方法中指定的文本。
同样,对于第二个 DesignableLabel 对象,您可以通过调用键路径
使用用户定义的运行时属性myLittleFriend
请注意,关键路径不使用单词 "set",而是将第一个单词小写。 setMyLittleFriend: 成为我的小朋友。
总而言之,这使您不必为每个 IB_DESIGNABLE 对象创建子类。