我创建了一个自定义按钮ModuleUIButton,它继承自UIButton。此自定义按钮具有一个名为cycleList的可变数组属性。

我有一个可变的ModuleUIButton数组,称为moduleList。我需要能够访问cycleList可变数组的元素,并且使用以下调用:

//Create ModuleUIButton
ModuleUIButton *newModuleButton = [[ModuleUIButton alloc]

//Customize ModuleUIButton
initWithFrame:CGRectMake(29.0,  (200.0+(88*moduleCounter)), 692, 80.0)];
[newModuleButton setTitle:@"Module" forState:UIControlStateNormal];
[newModuleButton setBackgroundColor:[UIColor purpleColor]];

//Add newModuleButton to moduleList array
[moduleList addObject:newModuleButton];

//Access the first element in moduleList which is newModuleButton and add
// a string to it's cycleList property
[[self.moduleList objectAtIndex:0].cycleList addObject:@"new Cycle"];

但是,当尝试编译时,我得到:

在非结构或联盟中请求成员“cycleList”

编译器是否在抱怨,因为它不知道moduleList的第0个元素将是ModuleUIButton?如果是这样,如何从可变数组中引用ModuleUIButton的任何属性?

任何见识将不胜感激!

最佳答案

编译器是否在抱怨,因为它不知道moduleList的第0个元素将是ModuleUIButton

究竟。 objectAtIndex:的返回类型为id。编译器无法知道实际的类型是什么,因此无法像通常那样将属性访问.cycleList转换为正确的方法调用,因为它无法知道正确的方法是什么。

本质上,属性访问通过重写代码来工作。编译器将看到foo.bar并转到foo的类,找到与bar属性对应的方法,然后根据需要将您写的内容转换为[foo bar][foo setBar:]。诀窍在于,由于与属性关联的方法可以具有任何名称(而不仅仅是标准的bar / setBar),因此编译器必须能够确定对象的类型,以便找出要使用的正确方法名称。

使用方括号语法时,您要告诉编译器要调用的方法的确切名称。它不需要进行任何查找,只是将其转换为对objc_msgSend的常规调用。

如果是这样,如何从可变数组中引用ModuleUIButton的任何属性?

只需使用“标准”语法:

[[self.moduleList objectAtIndex:0] cycleList]

您还可以按照Taskinoor的建议通过强制转换为编译器提供提示:
((ModuleUIButton *)[self.moduleList objectAtIndex:0]).cycleList

这明确告诉编译器将从objectAtIndex:返回的对象视为ModuleUIButton;然后可以确定方法名称应为。

关于objective-c - 访问数组中的元素-请求不是结构或联合的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6309874/

10-10 14:08