Ios Obj C和makeObjectsPerformSelector-我是否忽略了什么?
作为obj-c的新手,我一直在玩弄makeObjectsPerformSelector方法 我有两个数组,分别包含UISteppers和UITextfields: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
_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值)。