web-dev-qa-db-ja.com

iPhoneのUIAlertViewのUITextField-応答させる方法は?

UITextFieldをUIAlertViewに配置して上に移動したので、キーボードが次のコードで覆い隠さないようにします。

[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];
UITextField * nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];

アラートビューを処理する次のコードもあります。

- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex{    
    NSLog(@"%d", (int) buttonIndex);
    if (buttonIndex == 1) { // OK pushed
        NSLog([alert textField].text); // does not log anything
    } else {
        // Cancel pushed
}}

また、以下を含むUIAlertViewExtended.hファイルがあります。

@class UITextField, UILabel;

@interface UIAlertView(Extended)

-(UITextField *)textField;

@end

私の質問は、ユーザーが入力したテキストを取得する方法とキーボードを非表示にする方法です。

ありがとう、ベン

24
user21293

気になるかもしれない人のために、これが実用的な解決策です:

UIAlertView* dialog = [[UIAlertView alloc] init];
[dialog setDelegate:self];
[dialog setTitle:@"Enter Name"];
[dialog setMessage:@" "];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];

nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 100.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];

UITextField * nameFieldを作成したことを確認してください。 .hファイルでは、次のようにしてユーザーが入力したテキストを取得できます。inputText = [nameField text];

void)alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndexメソッド内。

---(重要な注意: iOS 4.0以降の場合、CGAffineTransformは自動的に実行されるため、4.0以降のみをターゲットにしている場合は、このビットを省略できます。それ以外の場合は、使用しているOSを確認し、それに応じて処理する必要があります。

31
user21293

ARCでiOS 5.0以降をサポートしている人なら誰でも、設定できるこの直接のalertViewStyleプロパティがあります。

-(void)showAlertWithTextField{
    UIAlertView* dialog = [[UIAlertView alloc] initWithTitle:@"Enter Name" message:@"" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];    
    [dialog setAlertViewStyle:UIAlertViewStylePlainTextInput];

    // Change keyboard type
    [[dialog textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
    [dialog show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 1)
        NSLog(@"%@",[[alertView textFieldAtIndex:0]text]);
}
49
chunkyguy

チェックアウトする価値があります

http://junecloud.com/journal/code/displaying-a-password-or-text-entry-Prompt-on-the-iphone.html?cmd=success#comment387

完全で包括的なソリューションのために。

14
Adam Ernst

明示的な参照を維持せずにテキストフィールドを見つける簡単な方法は、タグを設定することです。

nameField.tag = ALERTVIEW_NAMEFIELD;

親ダイアログを含め、0や他のUIViewオブジェクトタグとは異なるものにしてください。

その後、alertView:clickedButtonAtIndex:ハンドラーを使用すると、次の方法でテキストフィールドを取得できます。

UITextField *nameField = (UITextField *)[alertView viewWithTag:ALERTVIEW_NAMEFIELD];
6
squelart

より明確な解決策が見つかりました。次のコードスニペットを確認してください。 IAlertViewプロンプトのユーザー名とパスワードUITextFields

3
slatvick

この実装を確認してください: https://github.com/josecastillo/EGOTextFieldAlertView

2
gonso

これはiOS5およびARC用です。

-(void)showAlert {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"New Album" 
        message:@"Enter a name for the album." 
        delegate:self 
        cancelButtonTitle:@"Cancel" 
        otherButtonTitles:@"Save", nil];
    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;

    UITextField* textfield = [alertView textFieldAtIndex:0];
    textfield.placeholder = @"Title";

    [alertView show];
}

-(void)alertView:(UIAlertView *)alertView 
    didDismissWithButtonIndex:(NSInteger)buttonIndex 
{
    if (buttonIndex != 1) {
        NSLog(@"Cancel");
        return;
    }
    UITextField* textfield = [alertView textFieldAtIndex:0];
    NSLog(@"Save. text: %@", textfield.text);
}
1
neoneye

非常に良い方法は、UITextFieldDelegateのデリゲートメソッドを使用して、キーボードがアクティブになっている場合にのみダイアログを上に移動できることです。下記参照。

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelegate:self];

    CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, -20);
    [dialog setTransform: moveUp];

    [UIView commitAnimations];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationDelegate:self];

    CGAffineTransform moveDown = CGAffineTransformMakeTranslation(0.0, 0.0);
    [dialog setTransform: moveDown];

    [textField resignFirstResponder];

    return YES;
}
1
adam

これは実際には、通常のUIAlertViewコードの1行だけです。お役に立てれば!

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"test" message:@"This is a alert with a textfield" delegate:self cancelButtonTitle:@"YAY" otherButtonTitles:nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];
    [alert release];

iOS 5以降でのみ実行されます

0

IWasRobbedの回答に1つのマイナーなTweakを追加します。

GenericAlertDialogs.m:

+ (void)displayInputDialog:(NSString*)title delegate:(id<UIAlertViewDelegate>)delegate textFiled:(UITextField*)txtField
{
    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:delegate];
    [dialog setTitle:title];
    [dialog setMessage:@" "];
    [dialog addButtonWithTitle:@"Cancel"];
    [dialog addButtonWithTitle:@"OK"];

    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
    {
        txtField.frame = CGRectMake(20.0, 45.0, 245.0, 25.0);
    }
    else 
    {
        txtField.frame = CGRectMake(20.0, 30.0, 245.0, 25.0);
    }

    [txtField becomeFirstResponder];
    [txtField setBackgroundColor:[UIColor whiteColor]];
    [dialog addSubview:txtField];
    [dialog show];   
}

その他の.mファイル(UIAlertViewDelegateを実装)

 self->txtChangeName = [[UITextField alloc] init];
 [GenericAlertDialogs displayInputDialog:@"Some title...:" 
                                delegate:self 
                               textFiled:txtChangeName];

UIAlertViewDelegateプロトコル処理:

- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex 
{
    if(buttonIndex == 1)
    {
        if([txtChangeName.text length] > 0)
        {
            self->userInput = [txtChangeName text];
         }
     }
     self->txtChangeName = nil;
}

iOS 4+準拠。

0
driedler