2012-12-28 72 views
0

MyAlertView(UIAlertView中的子類)有這個方法:自定義UIAlertView中有塊回調

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (self.clickedButtonAtIndexBlock != NULL) 
     self.clickedButtonAtIndexBlock(buttonIndex); 
} 

我的問題是我如何定義回調,當我創建警報視圖?顯然,這是錯誤的:

alert.clickedButtonAtIndexBlock = ^{ 
    NSLog(@"clicked: %d", buttonIndex); 
} 

回答

2

嘗試做這樣的事情(我沒有測試過):

.h 
typedef void (^MyClickedIndexBlock)(NSInteger index); 

@interface YouInterface : YourSuperclass 
@property (nonatomic, strong) MyClickedIndexBlock clickedIndexBlock; 
@end 

.m 
//where you have to call the block 
if (self.clickedIndexBlock != nil) 
    self.clickedIndexBlock(buttonIndex); 

// where you want to receive the callback 
alert.clickedIndexBlock = ^(NSInteger index){ 
    NSLog(@"%d", index); 
}; 
0

嘗試這個

說你創建了一個名爲MyCustomAlert類,和你將它聲明爲這個變量。

MyCustomAlert *myCustomAlert = [[MyCustomAlent alloc] init]; 

你會把它放在你的頭文件中。

- (void)setCompletion:(void (^)(int selectedButtonIndex))completion; 

而你也把這個在您的實現文件

typedef void (^IntBlock)(int intBlock); 
IntBlock _completion; 

- (void)setCompletion:(void (^)(int selectedButtonIndex))completion{ 
    _completion = completion; 
} 

現在在你宣稱「myCustomAlert」項目。如果在

[myCustomAlert setCompletion: // And select the autocomplete item 

鍵入將結束與此

[myCustomAlert setCompletion:<#^(int intBlock)completion#>] 

值<#^(INT intBlock)完成#>將顯示爲這樣的泡沫。

enter image description here

當您按值進入,它會在塊填充供您使用。

[myCustomAlert setCompletion:^(int selectedButtonIndex) { 

} 

當你想觸發您的自定義類_completion塊,你會某處如下調用它在你的代碼。

- (void) callCompletionWithButtonIndex:(int) index{ 
    if (_completion != nil) _completion(index); 
} 

希望清除併發症。

+0

在這個答案中,你沒有顯示你指的是哪個頭文件/實現文件。您還介紹自定義警報概念,而不解釋它如何適用於解決方案。這迫使讀者猜測你的意圖(這總是不好)。爲了澄清這些錯失的機會,可以改進答案。 –

+0

我所指的頭文件和實現文件是你的,不是我的。因此,我無法爲您提供一個,因爲這意味着要放入您的代碼中。但您是對的,我沒有提供_completion調用。我已經補充說。 –

+0

當你提到一個頭文件和實現文件時,這是如何配合的?它是一個視圖控制器還是它是自定義警報的子類?對不起,如果我以前的請求不清楚。我可以簡單地假設後者,但特異性總是更好。 –

0

我寫了一個簡單的類LMSVBlocks來輕鬆地顯示警報並獲得1行中的塊回調。希望你會發現它用於此目的的

https://github.com/sourabhverma/LMSVBlocks

理念:爲了使UIAlertView中塊兼容,你需要另一個類(說LMSVBlockAlert)來處理的委託方法,當UIAlertView中代表會給回調,LMSVBlockAlert班級可以在該塊中發回電話。

代碼: (LMSVBlockAlert。米)

保持LMSVBlockAlert的所有實例在數組中,使他們有很強的借鑑意義

static NSMutableArray *_LMSVblockHandlersArray = nil; 

保持塊處理程序LMSVBlockAlert

@interface LMSVBlockAlert() <UIAlertViewDelegate> 
@property (nonatomic, copy) void (^cancelCompletionBlock)(); 
@property (nonatomic, copy) void (^confirmCompletionBlock)(); 
@end 

當一個新的警報被觸發創建新LMSVBlockAlert實例,它具有UIAlertView和代理回調

+(LMSVBlockAlert*)newInstance{ 
    LMSVBlockAlert *newIns = [[LMSVBlockAlert alloc] init]; 
    [LMSVBlockAlert updateHandlerArrayWith:newIns]; 
    return newIns; 
} 

當警報委託在LMSVBlockAlert被觸發發送回調來阻止,並從內存

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 

    switch (buttonIndex) { 
     case 0://Cancel 
     { 
      if(_cancelCompletionBlock){ 
       _cancelCompletionBlock(); 
      } 
     } 
      break; 
     case 1://OK 
     { 
      if(_confirmCompletionBlock){ 
       _confirmCompletionBlock(alertView); 
      } 
     } 
      break; 
     default: 
      break; 
    } 
    [_LMSVblockHandlersArray removeObject:self]; 
} 

現在很清楚這一點,你可以有兩種簡單的方法,可以給你UIAlertView中回調

+(UIAlertView*)promptAlertTwoBtn:(NSString*)msg title:(NSString*)title onCancel:(void (^)())onCancel onConfirm:(void (^)())onConfirm{ 

    return [[LMSVBlockAlert newInstance] showAlertMainWithTitle:title msg:msg onCancel:^{ 
     onCancel(); 
    } onConfirm:^(UIAlertView *alertView) { 
     onConfirm(); 
    }]; 
} 

-(UIAlertView*)showAlertMainWithTitle:(NSString*)title msg:(NSString*)msg onCancel:(void (^)())onCancel onConfirm:(void (^)(UIAlertView*))onConfirm{ 

    UIAlertView *newAlert = nil; 


    newAlert = [[UIAlertView alloc] 
        initWithTitle:title 
        message:msg 
        delegate:self 
        @"Cancel" 
        otherButtonTitles:@"Confirm", nil]; 


    [newAlert show]; 

    self.cancelCompletionBlock = onCancel; 
    self.confirmCompletionBlock = onConfirm; 

    return newAlert; 
} 

最後 希望你發現它很有用..

+0

已用非常簡單的代碼更新。 – SourabhV

0

你可以簡單地使用這些類別從github。

Alert_ActionSheetWithBlocks

這提供駁回既AlertView和動作片塊。

例如,

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"AlertView+Block" message:@"WithBlocks" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"newAlertViewWithTextFields",@"newAlertViewWithSingleTextField", nil]; 
[alert showWithFinishBlock:^(UIAlertView *alertView, NSInteger buttonIndex) 
{ if (buttonIndex == 0) { } else if (buttonIndex == 1) { } }]; 
從此它也提供了文本字段的方法

除了..

-(void) showWithFinishBlock:(FinishBlock_)block_; //-- AlertView with TextField [simple or secure] 

-(void) showWithTextFieldBlock:(TextFieldBlock_)block_ secure:(BOOL)isSecure; //-- AlertView with two textfields username & password 

你可以看看例子用捆綁。 我希望它對你有幫助。

3

我寫了一個博客張貼有關如何(以及爲何)加擋回調來提醒觀點,動作片和動畫:

http://blog.innovattic.com/uikitblocks/

如果你只是想這樣一個工作實現你可以下載從GitHub源文件:

https://github.com/Innovattic/UIKit-Blocks

用法:

UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"My easy alert" 
               message:@"Would you like to perform some kind of action?" 
             cancelButtonTitle:@"No" 
             otherButtonTitles:@"Yes", nil]; 
[alert setHandler:^(UIAlertView* alert, NSInteger buttonIndex) { 
    NSLog(@"Perform some kind of action"); 
} forButtonAtIndex:[alert firstOtherButtonIndex]]; 
[alert show]; 
+0

做得好。謝謝。 –

0

我已經寫在斯威夫特的簡單延伸,希望它有幫助

import UIKit 

extension UIAlertView { 

    func show(completion: (alertView: UIAlertView, buttonIndex: Int) -> Void){ 
     self.delegate = AlertViewDelegate(completion: completion) 
     self.show() 
    } 

    class func showInput(title: String?, message: String?, cancellable: Bool, completion: (text: String?) -> Void){ 

     var strOK = NSLocalizedString("OK",comment: "OK") 
     var strCancel = NSLocalizedString("Cancel",comment: "Cancel") 
     var alert = UIAlertView(title: title, message: message, delegate: nil, cancelButtonTitle: cancellable ? strCancel : strOK) 
     alert.alertViewStyle = UIAlertViewStyle.PlainTextInput 
     if(cancellable) { 
      alert.addButtonWithTitle(strOK) 
     } 
     alert.show { (alertView, buttonIndex) -> Void in 
      if(cancellable && alertView.cancelButtonIndex == buttonIndex) { 
       completion(text: nil) 
       return 
      } 
      completion(text: alertView.textFieldAtIndex(0)?.text) 
     } 
    } 

    private class AlertViewDelegate : NSObject, UIAlertViewDelegate { 
     var completion : (alertView: UIAlertView, buttonIndex: Int) -> Void 
     var retainedSelf : NSObject? 
     init(completion: (UIAlertView, Int) -> Void) { 
      self.completion = completion 
      super.init() 

      self.retainedSelf = self 
     } 

     func alertView(alertView: UIAlertView, didDismissWithButtonIndex buttonIndex: Int) { 
      var retain = self 
      retain.retainedSelf = nil 
      retain.completion(alertView: alertView, buttonIndex: buttonIndex) 
     } 
    } 
} 
1

入住這OpinionzAlertView我在幾個項目中使用它,工作對我有好處。這裏是樣本:

OpinionzAlertView *alert = [[OpinionzAlertView alloc] initWithTitle:@"title" 
                  message:@"message" 
                cancelButtonTitle:@"No, thanks" 
                otherButtonTitles:@[@"Done"] 
              usingBlockWhenTapButton:^(OpinionzAlertView *alertView, NSInteger buttonIndex) { 

               NSLog(@"buttonIndex: %li", (long)buttonIndex); 
               NSLog(@"buttonTitle: %@", [alertView buttonTitleAtIndex:buttonIndex]); 
              }]; 
[alert show]; 

我希望它會對你有所幫助。