这可能是
一个完全荒谬的问题,但是是否可以使用NSString
来代替一行代码?
for (int i = 0; i < 10: i++){
NSString *cam = @"locXCamProfileSwitch";
["%@", cam setOn:YES];
]
也可以将索引i
与X
的替换联系起来吗?
通常不可能(据我所知),但可以使用字符串访问 ivar、属性、类和方法。
-
可以像这样访问实例变量和属性:
[self valueForKey:@"key"];
-
类可以像这样引用:
Class cls = NSClassFromString(@"MyClass"); [cls aClassMethod];
-
方法可以像这样使用:
SEL selector = NSSelectorFromString(@"myMethod:"); [self performSelector:selector];
要将字符串中的占位符替换为数字,您可以使用格式化程序:
NSString *cam = [NSString stringWithFormat:@"loc%dCamProfileSwitch", i];
话虽如此,拥有编号的变量名称从来都不是一个好主意。
请改用数组:
int switchCount = 10;
NSMutableArray *switches = [[NSMutableArray alloc] initWithCapacity:switchCount];
for (int i = 0; i < switchCount; i++) {
CGRect rect = CGRectMake(10, 10+i*30, 70, 40); // or something like that.
UISwitch *sw = [[UISwitch alloc] initWithFrame:rect];
sw.tag = i;
[sw addTarget:self action:@selector(switchChanged:)
forControlEvents:UIControlEventValueChanged];
[self.view addSubview:sw];
[switches addObject:sw];
}
self.switches = [NSArray arrayWithArray:switches]; // assuming you have a property "switches".
然后你可以简单地迭代它:
for (UISwitch *switch in self.switches) {
[switch setOn:YES];
}
并在其中一个发生这样的更改时收到通知:
- (void)switchChanged:(id)sender {
UISwitch *theSwitch = (UISwitch *)sender; // the switch that changed.
int tag = theSwitch.tag; // number of switch that changed.
// do something....
}
按字符串名称查看目标 C 对象?
但本质上你做错了。创建一个包含 10 个开关的数组并对其进行迭代。
将所有开关添加到数组中,并使用其索引遍历该数组。