web-dev-qa-db-ja.com

UIAlertViewからテキストを取得する

アラートビューからテキストを取得し、それを可変配列に追加してテーブルビューに一覧表示しようとしています。数ヶ月前に投稿された同様の質問があることに気づきましたが、与えられた答えをどのように利用するかがわかりません。

-(IBAction)insert {
    UIAlertView* dialog = [[UIAlertView alloc] init];
    [dialog setDelegate:self];
    [dialog setTitle:@"Enter Name"];
    [dialog setMessage:@" "];
    [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];
    [dialog show];

    [data addObject:[nameField text]];
    [mainTableView reloadData];

しかし、インデックス0にnilオブジェクトを挿入しようとしていると表示されるため、アプリがクラッシュします。何が問題なのですか?

編集:Ok私はalertviewを処理するメソッドが不足していると思います。それで私はこれを見つけました:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex];
    if([buttonTitle isEqualToString:@"Cancel"]) {
        return;
    }
    else if([buttonTitle isEqualToString:@"Ok"]) {
        [data addObject:nameField.text];

    }

今、私はピースを接続する必要がありますが、方法がわかりません。

17
Snowman

UIAlertViewを使用するときによくある間違いは、showメッセージを送信するとメインスレッドがブロックされると考えることです。そうではありません。画面にアラートが表示されていても、コードは引き続き実行されます。したがって、渡したUITextFieldの値は存在しません。

UIAlertViewDelegateUIViewControllerを実装して、ユーザーがテキストフィールドに入力したものをすべて取得する必要があります。とはいえ、何も入力しないとnilの値はtextになるため、nilの値を確認する必要があります。

更新:この回答は、AppleがUITextFieldを介してアラートにUIAlertViewStyleを追加するためのAPIを作成する前に投稿されました。これは@から借用した更新されたコードです。マット

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name"
                                                message:@"  "   
                                               delegate:self 
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

次に、UIAlertViewDelegateでコールバックします。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        NSString *name = [alertView textFieldAtIndex:0].text;
        // Insert whatever needs to be done with "name"
    }
}
45
Wayne Hartman

AlertViewに独自のテキストフィールドを追加する必要はありませんが、代わりに適切なスタイルを設定してください

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name"
                                                message:@"  "   
                                               delegate:self 
                                      cancelButtonTitle:@"Cancel"
                                      otherButtonTitles:@"OK", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show];

次に、OK(ボタン1)を押した後、入力したテキストにアクセスします

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        NSString *name = [alertView textFieldAtIndex:0].text;
        // name contains the entered value
    }
}
27
Matt

UITextViewUIAlertViewを追加しようとしないでください。追加しないとAppleがアプリを拒否する可能性があります。

私はすでに私のアプリで同じ種類の機能を使用しました。しかし、Apple REJECTED MY APPUITextViewUIAlertViewを使用しているためです。

3
Ganesh NA

– alertView:clickedButtonAtIndex:は、UIAlertViewのデリゲートメソッドです。編集で定義したメソッドをコントローラーの実装に追加するだけで、コントローラーをAlertViewのデリゲートに設定済みなので、準備は完了です。

また、デリゲート関連の警告を回避するために、クラスヘッダーに追加します。

@interface MyViewController : UIViewController <UIAlertViewDelegate> {
...
};

挿入メソッドから[data addObject:[nameField text]];[mainTableView reloadData];を削除することを忘れないでください。

0
mralex
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert title" 
                                                  message:@"alert message" 
                                                 delegate:self 
                                        cancelButtonTitle:@"Cancel" 
                                        otherButtonTitles:@"Ok", nil];
[myAlert addTextFieldWithValue:nil label:@"<place holder>"];
[[myAlert textField] setTextAlignment:UITextAlignmentCenter];
[[myAlert textField] becomeFirstResponder];
[myAlert show];
[myAlert release];
myAlert = nil;               

カスタムテキストフィールドを追加する必要はありません。 addTextFieldWithValueメソッドを使用して直接追加できます。

0
Raxit