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

我有一个类与几个相似的属性 – UISliders,我想添加行动,当用户开始和结束使用每个滑块。 每个滑块将链接到相同的select器,所以我只是想迭代它们而不是写出几乎相同的代码块。

问题是,最有效的方法是什么? 我尝试了这样的事情: 在运行时循环所有的对象属性,但问题是,我不能调用addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEventsobjc_property_t property上的控制objc_property_t property 。 我应该坚持一个数组的属性,并迭代?

如果您不需要在运行时检查对象属性的dynamic级别,那么NSArray是最直接和最可读的方式。 就效率而言,我猜可能会产生一个types为void *的dynamic数组,并且可能会更快地进行迭代,但是考虑到典型大小,可能会带来更多的工作成果。

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

如果你确实需要调查你的属性,那么我会像对另一个问题的答案那样处理它。 我最初的答案build议parsing属性属性string来说明自定义的命名属性,但显然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); 
Interesting Posts