仍然是obj-c的新手,我正在使用makeObjectsPerformSelector方法。
我有两个分别包含UISteppers和UITextfields的数组:
_stepper = [NSArray arrayWithObjects:
_stepMa, _stepMafree, _stepDe, _stepDefree, _stepFl, _stepFlfree,
_stepEn, _stepEnfree, _stepEnBl, _stepEnBlfree, _stepVo, _stepVofree,
_stepVe, _stepVefree, _stepIn, _stepInfree, _stepOt, _stepOtfree,
_stepIn170, _stepIn170free, _stepZy, _stepZyfree,
nil];
_fields = [NSArray arrayWithObjects:
_MaFeld, _MaFeldfree, _DeFeld, _DeFeldfree, _FlFeld, _FlFeldfree,
_EnFeld, _EnFeldfree, _EnBlFeld, _EnBlFeldfree, _VoFeld, _VoFeldfree,
_VeFeld, _VeFeldfree, _InFeld, _InFeldfree, _OtFeld, _OtFeldfree,
_InFeld170, _InFeld170free, _ZyFeld, _ZyFeldfree,
nil];
在某些方法中我想重置它们:
- (void) resetFields
{
[_stepper enumerateObjectsUsingBlock: ^(UIStepper* stepper, NSUInteger idx, BOOL *stop)
{
stepper.value = 0;
}];
[_fields enumerateObjectsUsingBlock: ^(UITextField* field, NSUInteger idx, BOOL *stop)
{
field.text = @"0";
}];
}
按预期工作。
试图缩短那段代码我试着用上面提到的方法运气了:
- (void) resetFields
{
[_stepper makeObjectsPerformSelector:@selector(value) withObject:0];
[_fields makeObjectsPerformSelector:@selector(text) withObject:@"0"];
}
没有效果......我猜有些东西我没考虑,但是什么?
谢谢!
答案 0 :(得分:3)
performSelector
次调用(各种类型)只能使用Objective-C对象(可以用id
类型表示的对象)。 double
,BOOL
,int
等C类型无效,因此除非您将其类型更改为value
,否则无法以此方式设置NSNumber*
。
要设置text
属性,您需要使用setText:
选择器; text
是吸气剂。由于此属性类型是Objective-C类NSString
,因此performSelector将起作用。
答案 1 :(得分:3)
要绕过int类型而不是对象的问题,请使用KVC(键值编码)。如果在NSArray对象上调用setValue:forKey:,则调用setValue:forKey:方法对数组的每个对象进行调用。有了奖金,KVC正在管理所有原始的东西。
[_stepper setValue:@0 forKey:@"value"];
[_fields setValue:@"0" forKey:@"text"];