Ios Obj C和makeObjectsPerformSelector-我是否忽略了什么?

Ios Obj C和makeObjectsPerformSelector-我是否忽略了什么?,ios,objective-c,xcode,Ios,Objective C,Xcode,作为obj-c的新手,我一直在玩弄makeObjectsPerformSelector方法 我有两个数组,分别包含UISteppers和UITextfields: _stepper = [NSArray arrayWithObjects: _stepMa, _stepMafree, _stepDe, _stepDefree, _stepFl, _stepFlfree, _stepEn, _stepEnfree, _stepEnBl, _step

作为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"];
}
没有任何效果。。。我想有些事情我没有考虑,但是什么?


谢谢

performSelector
调用(所有类型)只能接受Objective-C对象(可以用
id
类型表示的对象)。像
double
BOOL
int
等C类型将不起作用,因此,除非将其类型更改为
NSNumber*
,否则不能以这种方式设置


要设置
text
属性,需要使用
setText:
选择器<代码>文本
是getter。由于此属性类型是Objective-C类
NSString
,performSelector将起作用。

performSelector
调用(所有类型)只能接受Objective-C对象(可以用
id
类型表示的对象)。像
double
BOOL
int
等C类型将不起作用,因此,除非将其类型更改为
NSNumber*
,否则不能以这种方式设置


要设置
text
属性,需要使用
setText:
选择器<代码>文本
是getter。由于此属性类型是Objective-C类
NSString
,PerformSelect将起作用。

要绕过int是C类型而不是对象的问题,请使用KVC(键值编码)。如果在NSArray对象上调用setValue:forKey:,则方法setValue:forKey:将在数组的每个对象上调用。另外,KVC还管理着所有原始的东西

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

要绕过int是C类型而不是对象的问题,请使用KVC(键值编码)。如果在NSArray对象上调用setValue:forKey:,则方法setValue:forKey:将在数组的每个对象上调用。另外,KVC还管理着所有原始的东西

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

setter是您需要执行的选择器,例如
–setText:
–setValue:
,但是
–makeObjectsPerformSelector:withObject:
将无法使用
–setValue:
,因为预期值是一个原语,而不是一个objectAaah!我不知道。塔恩克斯!setter是您需要执行的选择器,例如
–setText:
–setValue:
,但是
–makeObjectsPerformSelector:withObject:
将无法使用
–setValue:
,因为预期值是一个原语,而不是一个objectAaah!我不知道。塔恩克斯!啊,谢谢你的提示——愚蠢的我;只是假设而不是思考(因为.value也用于设置UIStepper值);只是假设而不是思考(因为.value也用于设置UIStepper值)。