1

こんにちは、NSMutableArrayのperformSelectorでトリッキーな問題が発生しました。PerformSelectorの機能を誤解している可能性があります。基本的に、オブジェクトを含むNSMutableArrayがあり(それらはすべてUIButtonから継承するクラスに基づくオブジェクトですが、それは重要ではないと思います)、配列内のすべてのオブジェクトにメッセージを送信する必要があります。

私のクラスのヘッダーファイルで、セレクターによって呼び出される関数を宣言しました。次のようになります。

-(void)scaleChangedWithANumber:(NSNumber *)scale;

この例では、配列に3つのオブジェクトが含まれています。私がそれらをアイテムごとに呼ぶならば、それは完璧に機能します:

NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];


ButtonOfElement *tmpButton1=[elementsButtonContainer objectAtIndex:0];
[tmpButton1 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];

ButtonOfElement *tmpButton2=[elementsButtonContainer objectAtIndex:1];
[tmpButton2 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];

ButtonOfElement *tmpButton3=[elementsButtonContainer objectAtIndex:2];
[tmpButton3 performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];

しかし、配列でperformSelectorを呼び出そうとすると(配列内のすべてのオブジェクトにメッセージを送信する必要があります):

NSNumber *tmpNumber=[NSNumber numberWithFloat:scale];
[elementsButtonContainer performSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
tmpNumber=nil;

エラーが発生します:

[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM scaleChangedWithANumber:]: unrecognized selector sent to instance 0x1737f0'
*** First throw call stack:
(0x34e456c3 0x370be97f 0x34e49227 0x34e47951 0x34d9f468 0x31d1 0x369a70eb 0x369a7447 0x369324d9 0x368f9c0d 0x36ae5649 0x3681df4f 0x3681c9b3 0x3682791f 0x368274eb 0x36814f29 0x36814843 0x337425d3 0x33742203 0x34e1a593 0x34e1a537 0x34e193b9 0x34d8c39d 0x34d8c229 0x3374131b 0x368688f9 0x2363 0x2308)
libc++abi.dylib: terminate called throwing an exception

もちろん、ループを使用して、アイテムごとに実行セレクターを呼び出すこともできますが、配列でperformSelectorを使用すると、よりエレガントで明確になると思いました。

4

2 に答える 2

11

これを試して:

[elementsButtonContainer makeObjectsPerformSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber];
于 2012-09-11T22:40:00.630 に答える
1

elementsButtonContainerというメソッドはありませんscaleChangedWithANumber。いくつかの異なるロジックで宣言するか、配列内のすべてのボタン サブクラスで既存のメソッドを呼び出す必要があります。

于 2012-09-11T22:26:53.953 に答える