我有一个具有几个类似属性的类 - UISliders,我想添加用户开始和结束使用每个滑块时的操作。每个滑块都将链接到同一个选择器,因此我考虑只是迭代它们,而不是编写 10 个几乎相同的代码块。
问题是,最有效的方法是什么?我尝试过这样的事情:在运行时循环遍历所有对象属性 https://stackoverflow.com/questions/9269372/loop-through-all-object-properties-at-runtime但问题是我不能打电话addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
on the objc_property_t property
。我应该将属性放在数组中并对其进行迭代吗?
如果您不需要涉及在运行时检查对象属性的动态级别,那么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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)