2014-05-04 99 views
0

我添加的UIButton編程(self.button是我的財產UIButton):IOS的​​UIButton的自定義的目標

self.button = [[UIButton alloc] initWithFrame:CGRectMake(139, 366, 42, 34)]; 
[self.button addTarget:self action:@selector(buttonPressed:completion:) forControlEvents:UIControlEventTouchUpInside]; 

我打電話編程的按鈕目標,也是我想的框架來調用目標,當用戶按下按鈕。

目標選擇器是:

-(void)buttonPressed:(UIButton*)sender completion:(void (^)())completionBlock; 

第二個參數是一個塊。

當我試圖自省/調用塊時,我得到一個異常EXC_BAD_ACCESS (code=2, address=0x0) 我知道我嘗試調用UITouchesEvent,因爲框架的目標行動。

如何使用完成塊自定義目標?

提前10倍!

+0

抱歉,但我不明白你想通過什麼塊...這個塊通過哪裏? –

+0

我試圖傳遞哪個塊並不重要,問題的核心是什麼,如何使用完成塊來製作UIButton的目標? – gran33

+0

我問這個只是爲了瞭解情況,但如果是核心,我回復下面;) –

回答

2

無法通過完成塊那裏,但你可以做這樣的事情:

self.button = [[UIButton alloc] initWithFrame:CGRectMake(139, 366, 42, 34)]; 
[self.button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

-(void)buttonPressed:(UIButton*)sender { 
    [self buttonPressed:sender completion:^{ 
     //something 
    }]; 
} 

-(void)buttonPressed:(UIButton*)sender completion:(void (^)())completionBlock { 
    //do something 

    //invoke block 
    completionBlock(); 
} 
0

你不能。對於按鈕動作,系統期望具有單個參數,並且那也是sender(動作方法的調用者),即UIButton實例本身。如果你想用第二個參數做任何事情,我會建議你有一個包裝一些東西一樣

-(void)buttonPressed:(UIButton*)sender 
{ 
[self customMethodWithcompletion:^{ 

}]; 
} 

裏面的customMethodWithcompletion您就可以執行操作。

0

一個target-action listener for UIKit必須具備以下三個特徵之一:

- (void)action 
- (void)action:(id)sender 
- (void)action:(id)sender forEvent:(UIEvent *)event 

如果有第一個參數,「發件人」控制(即你正在聽的動作控制)將被傳遞給它。如果還有第二個參數,則UIEvent對象將被傳遞給它。您無法控制傳遞給該方法的內容。

有許多第三方庫實現了UIControl的基於塊的API,您可以在Internet上找到它。基本上,他們所做的是將完成塊作爲關聯對象附加到控件,並在處理方法中檢索它。