0

我正在创建 UIView 的自定义子类。我目前正在基于Objective C 进行初始化 - 自定义视图并实现 init 方法?,因此无论是从代码加载还是从 xib 加载,都会完成一些初始化。

我现在遇到的问题是我正在添加一个“必需”属性(为了讨论,我们将其称为 reqProp) - 如果没有设置此属性,视图将无法呈现,并且必须在任何其他特定于的功能之前设置它可以使用我的视图子类。

因此,我认为强制执行此要求的自然位置是提供一个新的 init 函数,因此我不必担心在我的其余代码中没有设置它 - 例如

initWithFrame:(CGRect)frame forReqProp:(NSString *)reqProp;

但是,我不确定在通过 initWithCoder 进行初始化时如何强制执行相同的要求

我能想到的最接近的是要求在用户定义的运行时属性中指定此属性(就在需要在界面生成器中定义自定义类名称的位置),但在这种情况下,不清楚何时/是否应该“吹up”,因为没有指定属性。

我能想到的唯一其他选择就是有非常明确的文档,说明这个必需的属性必须是在使用视图之前设置的第一件事。

4

2 回答 2

0

我现在不在我的支持 XCode 的计算机上,所以我无法对此进行测试,但是如何从 initWithCoder 方法中呈现一个工作表,这将需要用户在方法完成之前输入 reqProp 的值。

于 2012-07-31T02:30:18.403 回答
0

如果问题可以通过要求它是使用视图之前设置的第一个属性来解决,那么初始化就不需要它。这里的建议将是很好的文档。

但是,通过一些重构可能会更好地解决潜在问题,因此它不需要是第一个属性集。在这种情况下,一个非常基本的重构可能涉及存储其他属性的字典,并且仅在设置所需属性后“真正”设置它们(并对渲染产生影响)。

例如:

- (void) setOptionalProperty1:(id)prop
{
    [propMap setObject:prop forKey:@"property1"];
    if (self.requiredProperty) {
        _optionalProperty1 = prop;
    }
}

- (void) setOptionalProperty2:(id)prop
{
    [propMap setObject:prop forKey:@"property2"];
    if (self.requiredProperty) {
        _optionalProperty2 = prop;
    }
}

- (void) setRequiredProperty:(id)requiredProp
{
    _requiredProperty = requiredProp;
    // now iterate over propMap and set those properties properly
}

它不一定是最好的重构,而是一个通用的简单示例,它应该完成工作并保持底层限制(必须首先设置必需的属性)完整,而不会对使用该类的开发人员强制要求。

于 2012-08-23T00:11:21.000 回答