新手问题:可以在运行时替换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我知道有一个更好的实际目标 - 获取对象属性的方法,我甚至发现了一个帖子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”的实际属性。但我希望它是一个数组,它会吐出每次循环迭代时会改变的实际属性(名称,标题,数字,属性等)
感谢您抽出时间回答新手问题:)
答案 0 :(得分:3)
您想要的是key-value coding。具体来说,您尝试撰写的行是[myObject setValue:valueOfAnotherArray[t] forKey:[NSString stringWithUTF8String:theChangingProperty[t]]]
。
答案 1 :(得分:2)
点编号在编译时解决,而不是运行时,因此您不能将其用于此目的。你必须使用setter名称。即setTheChangingProperty:
和performSelector:
,并将适当的对象作为值传入。
请注意,在一个简单的情况下,这可能会运作得很好,但是,有人可能已经进入并做了类似的事情:
@property (nonatomic, retain, setter=fooBarBaz:) id blurgle;
在上述情况下,您不能简单地认为setBlurgle:
是正确的制定者。
答案 2 :(得分: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]];
}