ObjectiveCeeds › Blocks: Die UIAlertView etwas komfortabler, bitte!

Blocks: Die UIAlertView etwas komfortabler, bitte!

Von Manfred Kreß

Seite 1 von 1



Blocks finden in den Apple Frameworks immer öfter Anwendung und machen uns das Leben oft leichter. Ich selbst verwende Blocks auch immer häufiger. In diesem kleinen Beispiel möchte ich zeigen, wie man sich die UIAlertView mit Hilfe eines Completition Händlers etwas komfortabler machen kann.

Es gibt eine neue Klasse - OCAlertView. Es wird eine neue Klassenmethode eingeführt. Diese zeigt einen Alert an. Die Methode ist von den Parametern her fast mit der init... von UIAlertView identisch, nur wird statt einem Delegate ein Completition Handler übergeben.
#import 

@interface OCAlertView : UIAlertView 


+ (void)showWithTitle:(NSString *)title
              message:(NSString *)message
  completitionHandler:(void (^)(NSInteger selectedIndex))completitionHandler
    cancelButtonTitle:(NSString *)cancelButtonTitle
    otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;

@end
In der Implementation erweitert OCAlertView die alte Klasse um ein "privates" Property, eben einen Block, der den Completition Handler speichert. OCAlertView ist dann selbst das UIAlertViewDelegate und in der didDismissWithButtonIndex: wird einfach der Handler aufgerufen und bekommt den selektierten Index übergeben.
#import "OCAlertView.h"

typedef void(^alertCompletitionHandler)(NSInteger selectedIndex);


@interface OCAlertView ()

@property (readwrite, strong) alertCompletitionHandler handler;

@end



@implementation OCAlertView

+ (void)showWithTitle:(NSString *)title
              message:(NSString *)message
  completitionHandler:(void (^)(NSInteger selectedIndex))completitionHandler
    cancelButtonTitle:(NSString *)cancelButtonTitle
    otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;
{
    OCAlertView *av = [[OCAlertView alloc] initWithTitle: title
                                                 message: message
                                                delegate: nil
                                       cancelButtonTitle: cancelButtonTitle
                                       otherButtonTitles: otherButtonTitles, nil];
    [av setDelegate: av];
    
    [av setHandler: completitionHandler];
    [av show];
}


- (void)alertView:(OCAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    alertCompletitionHandler handle = [alertView handler];
    handle (buttonIndex);
    [alertView setHandler: nil];
}
@end

Nun lässt sich der Alert mit nur einer (langen) Zeile Code anzeigen und das Ergebnis kann im Completition Handler ausgewertet werden. Zumindest der 0815 Standard Alert wird so um einiges komfortabler.
[OCAlertView showWithTitle: @"Title"
                       message: @"Message"
           completitionHandler:^(NSInteger selectedIndex) {

               NSLog(@"index %d", selectedIndex);

           }
             cancelButtonTitle: @"Cancel"
             otherButtonTitles: @"Button1", nil];

Solche Kleinigkeiten habe ich mittlerweile dutzendfach im meiner eigenen Standard Lib. Und ich denke, es ist ein anschauliches Beispiel, wie man mit eigenen Blocks arbeiten kann.


Seite: 1 von 1


Blocks: Die UIAlertView etwas komfortabler, bitte!