3

这可能是一个完全荒谬的问题,但是可以使用NSStringa 代替一行代码吗?

for (int i = 0; i < 10: i++){    
    NSString *cam = @"locXCamProfileSwitch";
    ["%@", cam setOn:YES];
]

也可以将索引i合并到替换中X吗?

4

3 回答 3

5

这通常是不可能的(据我所知),但可以通过使用字符串来访问 ivars、属性、类和方法。

  • 可以像这样访问实例变量和属性:

    [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....
}
于 2012-10-09T13:27:05.413 回答
1

按字符串名称查看Objective C 对象?

但本质上你做错了。创建一个包含 10 个开关的数组并对其进行迭代。

于 2012-10-09T13:28:35.363 回答
0

将所有开关添加到数组中,并使用其索引对其进行迭代。

于 2012-10-09T13:25:29.160 回答