3

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

问题是,最有效的方法是什么?我尝试过这样的事情: 在运行时循环遍历所有对象属性,但 问题是我无法调用addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents. objc_property_t property我应该将属性粘贴在数组中并对其进行迭代吗?

4

1 回答 1

4

如果您不需要在运行时检查对象属性的动态级别,那么 anNSArray是最直接和可读的方法;就效率而言,我想创建一个动态类型的数组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);
于 2013-01-27T00:32:20.917 回答