如何通过xib指定自定义视图初始化所需的属性?

时间:2012-07-30 22:30:57

标签: objective-c xcode uiview

我正在创建UIView的自定义子类。我目前正在基于Objective C - Custom view and implementing init method?进行初始化,因此无论是从代码加载还是从xib加载,都会进行一些初始化。

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

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

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

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

我能想到的最接近的是要求在用户定义的运行时属性中指定此属性(在接口构建器中需要定义自定义类名称的位置下),但在这种情况下,不清楚何时/如果我应该“爆炸”,因为没有指明属性。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

例如:

- (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
}

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