0

新手问题:可以在运行时将命令、属性或方法替换为 NSStrings 或 char 吗?

可以说我做这样的事情:

//these are the names of my properties of an NSObject I created
char theChangingProperty[17][18] = {"name", "title", "number", "property4", "property5", "property6", "property7", "property8", "property9", "property10", "property11", "property12", "property13", "property14", "property15", "property16", "property17"};

(PS我知道有一个更好的实际objective-c获取对象属性的方法,我什至发现了一个帖子Get an object properties list in Objective-C

无论如何,如何遍历列表并更改属性名称?假设我在循环期间在运行时使用点表示法......如果我想一次将对象的 17 个(或 100 个!)不同属性全部设置为其他数组的值,如下所示:

for (int t=1; t<17; t++) {
    myObject.theChangingProperty[t] = valueOfAnotherArray[t];
}

我知道objective-c 将寻找一个名为“theChangingProperty”的实际属性。但我希望它是一个数组,它将吐出随着每次循环迭代而改变的实际属性(名称、标题、编号、property4 等)

感谢您花时间回答新手问题:)

4

3 回答 3

3

您想要的称为键值编码。具体来说,您要编写的行是[myObject setValue:valueOfAnotherArray[t] forKey:[NSString stringWithUTF8String:theChangingProperty[t]]].

于 2010-11-15T04:50:03.450 回答
2

点表示法在编译时解析,而不是运行时解析,因此您不能将其用于此目的。您必须为此使用 setter 名称。即,setTheChangingProperty:performSelector:使用适当的对象作为值传入。

请注意,在一个简单的情况下,这可能会正常工作,但是,有人可能会进入并执行以下操作:

@property (nonatomic, retain, setter=fooBarBaz:) id blurgle;

您在上述情况下,将无法简单地假设setBlurgle:是正确的二传手。

于 2010-11-15T04:12:37.493 回答
1

您可以使用 setValue:forKey: 但请注意,属性键需要是 NSStrings,而不是 C 字符串,因此请声明您的数组:

NSString* theChangingProperty[17] = { @"name", ....

然后你会写:

for (int t = 0; t < 17; t++) 
{
    [myObject setValue: valueOfAnotherArray[t] forKey: theChangingProperty[t]];
}

或者你可以使用 performSelector:withObject: 但是你的数组需要包含选择器

SEL theChangingProperty[17] = { @selector(setName:), ....

for (int t = 0; t < 17; t++) 
{
    [myObject performSelector: theChangingProperty[t] withObject: valueOfAnotherArray[t]];
}
于 2010-11-15T10:15:19.923 回答