2012-09-11 13 views
1

你好,我對NSMutableArray的performSelector有一個棘手的麻煩。我有可能誤解了performSelector的作用。 基本上我有NSMutableArray與對象(他們都是基於我的類的對象,從UIButton繼承,但這並不重要,我猜),我需要發送消息到數組中的所有對象。對NSMutableArray的performSelector錯誤

在我的類的頭文件中,我聲明瞭函數,這是由選擇器調用的。它看起來像這樣:

-(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的陣列。

+1

這不是如何'-performSelector:'作品。你可以在NSArray上做一個類來做到這一點,但我認爲C函數會更適合這個任務。 –

+0

由於@ RichardJ.RossIII說'performSelector:'不能這樣工作。 '[object performSelector:@selector(someMethod)]'或多或少等同於[object someMethod]'。在NSArray上調用一個仲裁方法不會將該方法轉發給它的所有元素,這就是它崩潰的原因。看看kubi的回答,他有正確的想法。 –

回答

11

試試這個:

[elementsButtonContainer makeObjectsPerformSelector:@selector(scaleChangedWithANumber:) withObject:tmpNumber]; 
+0

這正是我需要的:)非常感謝。並感謝理查德和卡爾爲eplain。 –

1

elementsButtonContainer沒有稱爲scaleChangedWithANumber的方法。你需要用一些不同的邏輯聲明它,或者調用數組中所有按鈕子類的現有方法。

相關問題