2011-11-18 71 views
1

根據我的標題,我正在用一些UIButton構建一個視圖。 我在考慮將2個動作連接到一個UIButton事件,因爲該按鈕需要做兩件事,但我需要按照一定的順序來做。當爲同一事件提供多個IBActions時,IBActions會觸發什麼

無論我如何嘗試,似乎都無法改變動作觸發的順序。有沒有辦法讓我來決定這個,還是它是隨機的?

當我在界面生成器中右鍵單擊UIButton時,我看到兩個動作都添加到同一個事件中,但不管它們出現的順序是否改變了觸發順序。

希望你們中的一些人能幫助我。

回答

2

UIButtons是UIControl的子類,它使用了目標 - 動作模式進行交流活動。用於添加目標的程序界面通過addTarget:action:forControlEvents:方法公開。在接口生成器中連接IBActions只是使用相同接口的可視化方式;當加載包含它的.xib文件時,bundle loader將在unarchived按鈕上調用該方法。

關鍵問題是該方法中的參數target被UIControl內部添加到NSSet(或可變子類)中。根據定義,NSSets是無序的。這意味着當按鈕需要枚舉它的一組目標來分派事件時,枚舉的順序沒有很好的定義。

0

既然沒有明確的方式來表示,其中的動作應該被髮送的順序,你應該依賴的順序。取而代之的是,創建一個單獨的行動,調用您所需的順序關心的兩個動作:

- (IBAction)doFooAndBar:(id)sender 
{ 
    [self foo:sender]; 
    [self bar:sender]; 
} 
2

在任何書或甚至使用Google搜索時,您都不會得到對此問題的答案。

我曾親自試過,它按照IBActions名稱的字母順序工作。奇怪,但它是一個事實!

測試實施例下面:

helloworld.h

-(IBAction)a:(id)sender; 
-(IBAction)b:(id)sender; 
-(IBAction)c:(id)sender; 
-(IBAction)d:(id)sender; 
-(IBAction)e:(id)sender; 
-(IBAction)f:(id)sender; 

動作)G:(ID)發送者;

**HelloWorld.m file** 

-(IBAction)a:(id)sender 
{ 
    NSLog(@"I clicked a"); 
} 
-(IBAction)f:(id)sender 
{ 
    NSLog(@"I clicked f"); 
} 
-(IBAction)b:(id)sender 
{ 
    NSLog(@"I clicked b"); 
} 
-(IBAction)c:(id)sender 
{ 
    NSLog(@"I clicked c"); 
} 
-(IBAction)d:(id)sender 
{ 
    NSLog(@"I clicked d"); 
} 
-(IBAction)e:(id)sender 
{ 
    NSLog(@"I clicked e"); 
} 

現在這些行動[觸摸的內心]事件以任意順序鏈接到您的按鈕。你會發現同樣的輸出,如下圖所示:

輸出

2012-03-19 15:35:34.548 I clicked a 
2012-03-19 15:35:34.554 I clicked b 
2012-03-19 15:35:34.564 I clicked c 
2012-03-19 15:35:34.566 I clicked d 
2012-03-19 15:35:34.568 I clicked e 
2012-03-19 15:35:34.572 I clicked f 

乾杯!

快樂編碼!

+3

我很想知道這是否是您將它們添加到控件的順序 – QED

+0

似乎合理。這在我的應用程序中已經有一段時間了。 –

相關問題