【问题标题】:how to specify required property for custom view initialization through xib?如何通过 xib 指定自定义视图初始化所需的属性?
【发布时间】:2012-08-23 08:11:21
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 只想到合理的默认设置。
  • 我不能为这个特定的属性默认任何东西 - 它必须由开发人员使用这个视图指定。换句话说,我选择的任何默认值都是错误的,使用视图的开发人员需要在使用视图之前对其进行更改。

标签: objective-c xcode uiview


【解决方案1】:

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

【讨论】:

  • 您的意思是在 initWithCoder 期间提示用户输入吗?这似乎非常错误......
  • 是啊,想多了,我觉得你是对的,这可能是个坏主意。您可以在 viewWillAppear 中执行此操作,还是在此过程中为时已晚?似乎这是执行此操作的地方,而不是在 init 方法中。
【解决方案2】:

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

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

例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2019-11-16
    相关资源
    最近更新 更多