我有一个具有几个类似属性的类 - UISliders,我想为用户使用每个滑块开始和结束时添加操作。每个滑块都链接到同一个选择器,所以我想只是迭代它们而不是写出10个几乎完全相同的代码块。
问题是,最有效的方法是什么?我试过这样的事情:
Loop through all object properties at runtime
但问题是我无法在addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
上拨打objc_property_t property
。我应该只是将属性粘贴在一个数组中并迭代它吗?
答案 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);