当单个实例具有属性值更改时,我想不出一种方法让 IB 在设计时更新所有“实例”(而且我认为这通常是不希望的和非标准行为)。我相当肯定它不能完成,因为我认为 IB 在 IB 会话期间不会将您的自定义视图的实例保留在内存中。我认为它的作用是实例化视图,在其上设置属性,对其进行快照以进行渲染,然后释放它。
应该可以设置属性来设置视图的未来实例使用的“默认”值。我们可以通过将“默认”值存储在NSUserDefaults
(XCode's)中并读取其中的默认值来实现这一点initWithFrame:
,IB 将调用该默认值来初始化一个新实例。我们可以使用#if 对所有这些默认内容进行门控TARGET_INTERFACE_BUILDER
,这样它就不会在运行时出现在设备上。
IB_DESIGNABLE
@interface CoolView : UIView
@property (strong, nonatomic) IBInspectable UIColor* frameColor;
#if TARGET_INTERFACE_BUILDER
@property (strong, nonatomic) IBInspectable UIColor* defaultFrameColor;
#endif
@end
@implementation CoolView
- (id) initWithFrame:(CGRect)frame
{
self = [super initWithFrame: frame];
if ( self != nil ) {
#if TARGET_INTERFACE_BUILDER
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey: @"defaultCoolViewFrameColor"];
if ( colorData != nil ) {
self.frameColor = [NSKeyedUnarchiver unarchiveObjectWithData: colorData];;
}
#endif
}
return self;
}
- (void) drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 10);
CGRect f = CGRectInset(self.bounds, 10, 10);
[self.frameColor set];
UIRectFrame(f);
}
#if TARGET_INTERFACE_BUILDER
- (void) setDefaultFrameColor:(UIColor *)defaultFrameColor
{
_defaultFrameColor = defaultFrameColor;
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject: defaultFrameColor];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"defaultCoolViewFrameColor"];
}
#endif
@end
如果您同意强制 IB 完全重新加载您的 xib/storyboard 文件,您可能会更接近您的原始目标(更新 IB 中的所有“实例”)。为此,您可能必须使用上述技术并将其扩展为initWithCoder:
在您的视图上的自定义方法中包含代码。
您可能会变得非常棘手并尝试“触摸”正在编辑的 xib 文件,这可能会提示 IB 重新加载?