Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何通过xib指定自定义视图初始化所需的属性?_Objective C_Xcode_Uiview - Fatal编程技术网

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

Objective c 如何通过xib指定自定义视图初始化所需的属性?,objective-c,xcode,uiview,Objective C,Xcode,Uiview,我正在创建UIView的自定义子类。我目前正在基于进行初始化,因此无论是从代码还是从xib加载,都会进行一些初始化 我现在遇到的问题是,我正在添加一个“必需”的属性(为了讨论起见,我们称之为reqProp)——如果不设置该属性,视图将无法呈现,并且必须先设置该属性,然后才能使用特定于我的视图子类的任何其他功能 因此,我认为执行此要求的自然位置是提供一个新的init函数,因此我不必担心在我的代码的其余部分没有设置它-例如 initWithFrame:(CGRect)frame forReqProp

我正在创建UIView的自定义子类。我目前正在基于进行初始化,因此无论是从代码还是从xib加载,都会进行一些初始化

我现在遇到的问题是,我正在添加一个“必需”的属性(为了讨论起见,我们称之为reqProp)——如果不设置该属性,视图将无法呈现,并且必须先设置该属性,然后才能使用特定于我的视图子类的任何其他功能

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

initWithFrame:(CGRect)frame forReqProp:(NSString *)reqProp;
但是,我不确定如何在通过initWithCoder初始化时强制执行相同的要求

我能想到的最接近的方法是要求在用户定义的运行时属性中指定此属性(就在需要在interface builder中定义自定义类名的位置下),但在这种情况下,由于未指定属性,因此不清楚何时/是否应“爆炸”


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

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

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

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

例如:

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

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

我只想到合理的默认值。我不能为这个特定属性默认任何东西-它必须由使用此视图的开发人员指定。换句话说,我选择的任何默认值都是错误的,使用视图的开发人员需要在使用视图之前对其进行更改。您的意思是在initWithCoder期间提示用户输入吗?这似乎是非常错误的…是的,在仔细考虑之后,我认为你是对的,这可能是个坏主意。您可以在ViewWillExisten中执行此操作,还是在该过程中太晚了?这似乎是做这件事的地方,而不是在init方法中。