Manchmal möchte man eine Abfrage (Dialog) erstellen um zB. eine Benutzereingabe zu erhalten. Oft braucht man solche Dialoge um eventuell ein Passwort abzufragen. Ich möchte euch in diesem kleinem Tutorial zeigen, wie ihr UIAlertView erweitertet und Textfelder als Subview hinzufügt.

Zunächst benötigen wir hierfür ein Interface (Headerdatei), welches wie folgt aufgebaut ist:

@interface TextboxAlertView : UIAlertView {
    UITextField *textField;
    UITextField *repeatField;
}

@property (nonatomic, retain) UITextField *textField;
@property (nonatomic, retain) UITextField *repeatField;
@property (readonly) NSString *enteredText;
@property (readonly) NSString *repeatText;

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okButtonTitle withRepeatField:(BOOL)withRepeat;

@end

Was definieren wir hier genau?

@interface TextboxAlertView : UIAlertView {

Wir erstellen ein Interface (Eine Klassendefinition) mit dem Namen TextboxAlertView, welches von UIAlertView erbt. Es wird also eine Subclass von UIAlertView erstellt um bestimmte Funktionen überschreiben zu können.

Da wir in unserer initialisierungs-Methode namens initWithTitle das Attribut withRepeatField erwarten, definieren wir also zwei UITextField Membervariablen.

Die @property-Zeilen erzeugen die Getter- und Setter-Methoden der zugehörigen Klassenvariablen. Die Pointer auf enteredText und repeatText habe ich deswegen hinzugefügt, da es mit diesen einfacher ist auf die eingegebenen Werte der Textfelder zurück zu greifen. (Wir haben ja im Hinterkopf, dass es sich um Textfelder innerhalb eines UIAlertView-Dialoges handelt.

Die letzte Zeile definiert die Methode, mit welcher die Klasse TextboxAlertView initialisiert werden soll. Sie erwartet einen Titel, einen Text, eine Delegate-Klasse, einen abbrechen-Button sowie evtl. andere Buttons und unser neues Attribut withRepeatField.  Mit diesem letzten Attribut legen wir beim initialisieren des Dialoges fest, ob ein zweites Feld hinzugefügt werden soll oder nicht.

Kommen wir also zur Implementation unserer Klassendefinition, welche wie folgt aussehen könnte:

// Import the header definition for TextboxAlertView.
#import "TextboxAlertView.h"

// Implementation keyword.
@implementation TextboxAlertView

// Create getters and setters for specified class members.
@synthesize textField, repeatField;
@synthesize enteredText, repeatText;

// Implementation of initWithTitle
// Message depends on the last attribute value (TRUE/FALSE).
- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle okButtonTitle:(NSString *)okayButtonTitle withRepeatField:(BOOL)withRepeat {

    // Set message to get a greater UIAlertView.
    if (withRepeat == TRUE) {
        message = @"nnn";
        cancelButtonTitle = nil;
    }
    else {
        message = @"nn";
    }

    if (self = [super initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:okayButtonTitle, nil])
    {
        // Create text input field: UITextField.
        UITextField *theTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 51.0, 260.0, 25.0)];
        [theTextField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
        [theTextField setAutocorrectionType:UITextAutocorrectionTypeNo];
        [theTextField setBorderStyle:UITextBorderStyleRoundedRect];
        [theTextField setDelegate:delegate];
        [theTextField setClearsOnBeginEditing:YES];

        // Add current text field as subview to UIAlertView.
        [self addSubview:theTextField];
        self.textField = theTextField;
        [theTextField release];

        if (withRepeat == TRUE) {
            // Create a second textfield if requested for repetition.
            UITextField *theRepeatField = [[UITextField alloc] initWithFrame:CGRectMake(12.0, 81.0, 260.0, 25.0)];
            [theRepeatField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
            [theRepeatField setAutocorrectionType:UITextAutocorrectionTypeNo];
            [theRepeatField setBorderStyle:UITextBorderStyleRoundedRect];
            [theRepeatField setDelegate:delegate];
            [theRepeatField setClearsOnBeginEditing:YES];

            // Add current text field as subview to UIAlertView.
            [self addSubview:theRepeatField];
            self.repeatField = theRepeatField;
            [theRepeatField release];
        }

        // Move view/dialog to show it on another position.
        CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 25.0);
        [self setTransform:translate];
    }

    return self;
}

- (void)show {
    // Set first responder to textField field.
    [self.textField becomeFirstResponder];
    [super show];
}

- (NSString *)enteredText {
    // Returns the value from textField text field.
    return self.textField.text;
}

- (NSString *)repeatText {
    // Returns the value from repeatField text field.
    return self.repeatField.text;
}

- (void)dealloc
{
    [textField release];
    [repeatField release];

    [super dealloc];
}

@end

Soweit so gut. Doch wie kann man das ganze nun endlich in seinem eigenem Projekt nutzen? Auch hier sind die Zeilen schnell geschrieben:

TextboxAlertView *alertView = [[TextboxAlertView alloc] initWithTitle:@"Passwort" message:nil delegate:self cancelButtonTitle:nil okButtonTitle:@"OK" withRepeatField:TRUE];
[alertView show];
[alertView release];

Super! Nun ist es fast geschafft. Unsere UIAlertView as. TextboxAlertView wird nun mit zwei Textfeldern, einem OK-Button sowie dem Titel Passwort angezeigt. Doch wie komme ich nun an die eingegeben Strings?

Dazu müssen wir die Delegate-Methode willDismissWithButtonIndex implementieren und auf den “Touch” warten.

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex;

Innerhalb dieser Methode können dann die Texte mit folgendem Code abgefragt werden:

alertView.textField.text

Abhängig von der endgültigen Implementierung könnte auch ein Cast von nöten sein:

NSString *str = (TextboxAlertView *)…
© 2010-2012 RenePardon BoonWeb Suffusion theme by Sayontan Sinha