Obj C和makeObjectsPerformSelector - 我忽略了什么吗?

时间:2014-07-03 14:31:32

标签: ios objective-c xcode

仍然是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"];
}

没有效果......我猜有些东西我没考虑,但是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

performSelector次调用(各种类型)只能使用Objective-C对象(可以用id类型表示的对象)。 doubleBOOLint等C类型无效,因此除非您将其类型更改为value,否则无法以此方式设置NSNumber*

要设置text属性,您需要使用setText:选择器; text是吸气剂。由于此属性类型是Objective-C类NSString,因此performSelector将起作用。

答案 1 :(得分:3)

要绕过int类型而不是对象的问题,请使用KVC(键值编码)。如果在NSArray对象上调用setValue:forKey:,则调用setValue:forKey:方法对数组的每个对象进行调用。有了奖金,KV​​C正在管理所有原始的东西。

[_stepper setValue:@0 forKey:@"value"];
[_fields setValue:@"0" forKey:@"text"];