web-dev-qa-db-ja.com

目的cを使用してUIAlertControllerのテキストフィールドから入力にアクセスするにはどうすればよいですか?

すべてをAlertViewからAlertControllerに切り替えていますが、AlertControllerのテキストフィールドにユーザーが入力した内容を取得するObjectiveCのオンラインのものが見つかりません。これが私が持っているものです:

if ([UIAlertController class]) {
            UIAlertController *alertControllerK2 = [UIAlertController
                                                    alertControllerWithTitle:@"\u00A0"
                                                    message:@"Please enter the first number."
                                                    preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *K2okAction = [UIAlertAction
                                         actionWithTitle:@"OK"
                                         style:UIAlertActionStyleDefault
                                         handler:nil];
            [alertControllerK2 addTextFieldWithConfigurationHandler:^(UITextField *K2TextField)
             {
                 K2TextField.placeholder = NSLocalizedString(@"Please enter the first number.", @"Please enter the first number.");
             }];
            [alertControllerK2 addAction:K2okAction];
            [self presentViewController:alertControllerK2 animated:YES completion:nil];
        } else {
            UIAlertView *alertK2;
            alertK2 = [[UIAlertView alloc]
                       initWithTitle:@"\u00A0"
                       message:@"Please enter the first number."
                       delegate: self
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil];
            alertK2.alertViewStyle=UIAlertViewStylePlainTextInput;
            [alertK2 show];
        }

問題は、K2TextFieldがUIAlertController内で定義されているため、そのコードの外部からアクセスできないことです。しかし、事前に定義しようとすると、エラーメッセージが表示されます。どんな助けでも大歓迎です!

17
Allison

UIAlertControllerにはtextFieldsの配列があり、それらを追加したときの順序になっています(最初に追加したのはインデックス0です)。これはジェネリック配列であるため、textフィールドにアクセスする前に結果をキャストする必要があります。

__weak UIAlertController *alertRef = alertController;
UIAlertAction* okAction = [UIAlertAction actionWithTitle:@"Button Text"
                                         handler:^(UIAlertAction * action) {
                                             // access text from text field
                                             NSString *text = ((UITextField *)[alertRef.textFields objectAtIndex:0]).text;
                                         }];
32
BeccaP

私の場合、スクリプトのさまざまなポイントでAlertControllerを再利用しているので、ヘッダーの.hファイルでグローバルにしました。

 UIAlertController *alertController;

次に、実装.mファイルで、次のように現在のアラートに割り当てます。

 alertController = (UIAlertController *)self.presentedViewController;

上記は、既存のアラートを取得してグローバルに割り当てます。これを機能させるには、最初に初期化するか、新しいものを作成する必要があります。

 UIAlertController* anyALERTname = [UIAlertController alertControllerWithTitle:@"Alert Title" message:yourAlertMessage preferredStyle:UIAlertControllerStyleAlert];

現在のAlertControllerができたので、TextFieldにアクセス(および取得)できます。

 if (alertController) {

    //go and get the action field

    UITextField *alertText1 = alertController.textFields.firstObject;

    NSLog(@"what is alert text? %@",alertText1.text);


}
4
Jim Rota