iPhoneでテキスト入力ポップアップダイアログボックスを取得する簡単な方法は何ですか


125

ユーザー名を取得したい。シンプルなテキスト入力ダイアログボックス。これを行う簡単な方法はありますか?


1
9月頃まで数か月待つだけで、あなたの人生はずっと楽になります。
ジョナサン。

回答:


264

iOS 5では、これに新しく簡単な方法があります。実装が完全かどうかUITableViewCellはわかりません。たとえばのような優雅なものではないのですが、iOS APIで標準でサポートされるようになったので、間違いなくうまくいくはずです。これにはプライベートAPIは必要ありません。

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"This is an example alert!" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];
[alert release];

これにより、次のようなalertViewがレンダリングされます(XCode 4.2のiPhone 5.0シミュレーターから取得したスクリーンショット):

alertViewStyleをUIAlertViewStylePlainTextInputに設定したアラートの例

ボタンを押すと、通常のデリゲートメソッドが呼び出され、そこで次のようにtextInputを抽出できます。

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

ここでは、入力された結果をNSLogで表示しています。本番用コードでは、おそらく、alertViewへのポインタをグローバル変数として保持するか、alertViewタグを使用して、デリゲート関数が適切に呼び出されたかどうかを確認する必要UIAlertViewがありますが、この例では問題ありません。

UIAlertView APIをチェックアウトすると、さらにいくつかのスタイルが定義されていることがわかります。

これが役に立てば幸い!

-編集-

alertViewを少しいじってみましたが、必要に応じてtextFieldを編集することは完全に可能であるというアナウンスは必要ないと思いますUITextField。これを行うことで、元の質問で指定したとおりにalertViewを作成しました。遅くなることはありませんよね。

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeNumberPad;
alertTextField.placeholder = @"Enter your name";
[alert show];
[alert release];

これにより、次のアラートが生成されます。

UIAlertViewPlainTextInput alertStyleを使用してユーザー名を尋ねるUIAlertView

先ほど私が投稿したのと同じデリゲートメソッドを使用して、入力からの結果を処理できます。が閉じるのを防ぐことができるかどうかはわかりUIAlertViewません(shouldDismissデリゲート関数AFAIK はありません)。したがって、ユーザー入力が無効な場合は、show正しい入力が行われるまで新しいアラート(またはこのアラートを再発行)を行う必要があると思います入りました。

楽しんで!


1
自動参照カウントを使用すると、自分でオブジェクトを保持および解放する必要がなくなります。
Waqleh 2015年

5
私が知っているが、この答えは、2011年に書かれた
Warkst

3
この方法は、IOS 9.0以降廃止されています。利用代わりUIAlertController:
EckhardN

Swift 4のサポートを探している場合:stackoverflow.com/a/10689318/525576
John Riselvato

186

ユーザーがテキストを入力した後に確実にコールバックされるようにするには、構成ハンドラー内でデリゲートを設定します。 textField.delegate = self

Swift 3&4(iOS 10-11):

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
    textField.placeholder = "Enter text:"
    textField.isSecureTextEntry = true // for password input
})
self.present(alert, animated: true, completion: nil)

Swift(iOS 8-10)の場合:

ここに画像の説明を入力してください

override func viewDidAppear(animated: Bool) {
    var alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil))
    alert.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Enter text:"
        textField.secureTextEntry = true
        })
    self.presentViewController(alert, animated: true, completion: nil)
}

Objective-C(iOS 8)の場合:

- (void) viewDidLoad 
{
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Alert" message:@"Message" preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"Click" style:UIAlertActionStyleDefault handler:nil]];
    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
        textField.placeholder = @"Enter text:";
        textField.secureTextEntry = YES;
    }];
    [self presentViewController:alert animated:YES completion:nil];
}

iOS 5-7の場合:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Alert" message:@"INPUT BELOW" delegate:self cancelButtonTitle:@"Hide" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

ここに画像の説明を入力してください


注:以下はiOS 7では機能しません(iOS 4-6は機能します)

別のバージョンを追加するだけです。

UITextFieldのあるUIAlert

- (void)viewDidLoad{

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Preset Saving..." message:@"Describe the Preset\n\n\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil];
    UITextField *textField = [[UITextField alloc] init];
    [textField setBackgroundColor:[UIColor whiteColor]];
    textField.delegate = self;
    textField.borderStyle = UITextBorderStyleLine;
    textField.frame = CGRectMake(15, 75, 255, 30);
    textField.placeholder = @"Preset Name";
    textField.keyboardAppearance = UIKeyboardAppearanceAlert;
    [textField becomeFirstResponder];
    [alert addSubview:textField];

}

それから私は[alert show];それが欲しいときに電話します。

進む方法

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         
    NSString* detailString = textField.text;
    NSLog(@"String is: %@", detailString); //Put it on the debugger
    if ([textField.text length] <= 0 || buttonIndex == 0){ 
        return; //If cancel or 0 length string the string doesn't matter
    }
    if (buttonIndex == 1) {
        ...

    }
}


1
私はIOS 4以来このようなものを持っていましたが、OS 7で壊れるようです今すぐWakrstのコードを使用してください-コードの多くの行を保存してください。
Dave Appleton

では、iOS7でこれを行う正しい方法は何でしょうか?iOS6 SDKを使用してビルドしていますが、iOS7ではまだ奇妙です。
sebrock 2013

質問にiOS7のサポートを追加しました
John Riselvato 2013

1
alertView:(UIAlertView *) clickedButtonAtIndex:(NSInteger)buttonIndextextField.textの値をフェッチするために、デリゲートメソッドに以下を配置する必要があることがわかりました。`NSString * theMessage = [alertView textFieldAtIndex:0] .text; `
James Perih

1
最新バージョンのSwiftに準拠するには、Swiftコードの「var alert」を「let alert」に置き換えます
Matei Suica

11

Warkstの3番目のコードスニペットをテストしました-数値ではなくデフォルトの入力タイプに変更したことを除いて、うまくいきました:

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Hello!" message:@"Please enter your name:" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField * alertTextField = [alert textFieldAtIndex:0];
alertTextField.keyboardType = UIKeyboardTypeDefault;
alertTextField.placeholder = @"Enter your name";
[alert show];

いい視点ね!私は当時textFieldをいじっていて、コードスニペットをアップロードする前にキーボードタイプを変更するのを忘れていました。私のコードがあなたを助けることができてうれしい!
Warkst 2012

11

IOS 9.0以降はUIAlertControllerを使用します:

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                                                           message:@"This is an alert."
                                                          preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                  handler:^(UIAlertAction * action) {
                    //use alert.textFields[0].text
                                                       }];
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction * action) {
                                                          //cancel action
                                                      }];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    // A block for configuring the text field prior to displaying the alert
}];
[alert addAction:defaultAction];
[alert addAction:cancelAction];
[self presentViewController:alert animated:YES completion:nil];

5

重要な情報を追加したかったのですが、おそらく回答を求めている人がすでに知っているかもしれないという前提で省略されたと思います。この問題は頻繁に発生しviewAlertUIAlertViewメッセージのボタンのメソッドを実装しようとすると私も行き詰まりました。これを行うには、最初に次のようなデリゲートクラスを追加する必要があります。

@interface YourViewController : UIViewController <UIAlertViewDelegate>

また、ここには非常に役立つチュートリアルがあります

お役に立てれば。


5

UIViewControllerでこのSwiftコードを試してください-

func doAlertControllerDemo() {

    var inputTextField: UITextField?;

    let passwordPrompt = UIAlertController(title: "Enter Password", message: "You have selected to enter your passwod.", preferredStyle: UIAlertControllerStyle.Alert);

    passwordPrompt.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        // Now do whatever you want with inputTextField (remember to unwrap the optional)

        let entryStr : String = (inputTextField?.text)! ;

        print("BOOM! I received '\(entryStr)'");

        self.doAlertViewDemo(); //do again!
    }));


    passwordPrompt.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        print("done");
    }));


    passwordPrompt.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
        textField.placeholder = "Password"
        textField.secureTextEntry = false       /* true here for pswd entry */
        inputTextField = textField
    });


    self.presentViewController(passwordPrompt, animated: true, completion: nil);


    return;
}

3

スウィフト3:

let alert = UIAlertController(title: "Alert", message: "Message", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.default, handler: nil))
alert.addTextField(configurationHandler: {(textField: UITextField!) in
     textField.placeholder = "Enter text:"
})

self.present(alert, animated: true, completion: nil)

2

サブビューUIAlertViewでa を使用しますUITextField。テキストフィールドを手動で追加するか、iOS 5では新しい方法のいずれかを使用できます。


別の投稿から次のコードを追加しましたが、ポップアップが画面の外に表示されます(非常に上に表示され、下半分だけが表示されます)
user605957

2
codeUIAlertView * myAlertView = [[UIAlertView alloc] initWithTitle:@ "ここにタイトルがあります"メッセージ:@ "これはカバーされます" delegate:self cancelButtonTitle:@ "Cancel" otherButtonTitles:@ "OK"、nil]; UITextField * myTextField = [[UITextField alloc] initWithFrame:CGRectMake(12.0、45.0、260.0、25.0)]; CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0.0、130.0); [myAlertView setTransform:myTransform]; [myTextField setBackgroundColor:[UIColor whiteColor]]; [myAlertView addSubview:myTextField]; [myAlertViewショー]; [myAlertViewリリース];
user605957

同様のコードを試してみたところ、テキストボックスとボタンを含むアラートビューが表示されましたが、テキストフィールドに十分なスペースがありません。タイトルとボタンの間に挟まって両方に触れています。フレームをスケーリングするためにいくつかの変換を試みましたが、ボタンは元の場所に留まっているため、移動する必要もあります。ボタンの位置を変更する方法がわかりません。プロンプトからユーザーに1行のテキストを取得するために、これらすべてが必要であるとは信じられません。これより良い方法はありませんか?
ディーン・デイビッズ

2

このようにUIAlertViewにビューを追加します。iOS 5では、あなたのためにそれを行う「魔法の」ことがいくつかあります(しかし、それはすべてNDAの下にあります)。


私はこれを試してみましたが、いくらかうまくいきます。ポップアップが画面から外れていることを除いて(ポップアップの上半分は切り取られています)。何かアイデアはありますか?
user605957

同じ問題があり、setTranformMakeTranslation(0,109)を削除すると、iPadとiPhoneの両方で修正されました。それなしで正しい場所に現れました。
joeld

2

XamarinとC#の場合:

var alert = new UIAlertView ("Your title", "Your description", null, "Cancel", new [] {"OK"});
alert.AlertViewStyle = UIAlertViewStyle.PlainTextInput;
alert.Clicked += (s, b) => {
    var title = alert.ButtonTitle(b.ButtonIndex);
    if (title == "OK") {
        var text = alert.GetTextField(0).Text;
        ...
    }
};

alert.Show();

0

John Riselvatoの答えに基づいて、UIAlertViewから文字列を取得します...

alert.addAction(UIAlertAction(title: "Submit", style: UIAlertAction.Style.default) { (action : UIAlertAction) in
            guard let message = alert.textFields?.first?.text else {
                return
            }
            // Text Field Response Handling Here
        })

-1
UIAlertview *alt = [[UIAlertView alloc]initWithTitle:@"\n\n\n" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

UILabel *lbl1 = [[UILabel alloc]initWithFrame:CGRectMake(25,17, 100, 30)];
lbl1.text=@"User Name";

UILabel *lbl2 = [[UILabel alloc]initWithFrame:CGRectMake(25, 60, 80, 30)];
lbl2.text = @"Password";

UITextField *username=[[UITextField alloc]initWithFrame:CGRectMake(130, 17, 130, 30)];
UITextField *password=[[UITextField alloc]initWithFrame:CGRectMake(130, 60, 130, 30)];

lbl1.textColor = [UIColor whiteColor];
lbl2.textColor = [UIColor whiteColor];

[lbl1 setBackgroundColor:[UIColor clearColor]];
[lbl2 setBackgroundColor:[UIColor clearColor]];

username.borderStyle = UITextBorderStyleRoundedRect;
password.borderStyle = UITextBorderStyleRoundedRect;

[alt addSubview:lbl1];
[alt addSubview:lbl2];
[alt addSubview:username];
[alt addSubview:password];

[alt show];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.