iOS循环对象的属性并添加操作

时间:2013-01-27 00:09:09

标签: ios iterator

我有一个具有几个类似属性的类 - UISliders,我想为用户使用每个滑块开始和结束时添加操作。每个滑块都链接到同一个选择器,所以我想只是迭代它们而不是写出10个几乎完全相同的代码块。

问题是,最有效的方法是什么?我试过这样的事情: Loop through all object properties at runtime 但问题是我无法在addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents上拨打objc_property_t property。我应该只是将属性粘贴在一个数组中并迭代它吗?

1 个答案:

答案 0 :(得分:4)

如果您不需要在运行时检查对象属性的动态级别,那么NSArray是最简单易读的方式;就效率而言,我想制作一个void *类型的动态数组,并且可以更快地进行迭代,但考虑到典型尺寸,可以在可疑的速度下为您提供更多的工作。

for (UISlider *slider in @[self.slider1, self.slider2, self.slider3]) {
    [slider addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
}

如果您确实需要调查您的属性,那么我会像其他问题的答案那样接近它。我的答案首先建议解析属性属性字符串以考虑自定义命名属性,但显然KVC会为您处理。

unsigned int numberOfProperties;
objc_property_t *properties = class_copyPropertyList([self class], &numberOfProperties);
for (int i = 0; i < numberOfProperties; i++) {
    objc_property_t property = propertieses[i];
    NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
    id valueForProperty = [self valueForKey:propertyName];
    if ([valueForProperty isKindOfClass:[UISlider class]]) {
        [(UISlider *)valueForProperty addTarget:self 
                                         action:@selector(action:) 
                               forControlEvents:UIControlEventValueChanged];
    }
}
free(properties);