アラートビューからテキストを取得し、それを可変配列に追加してテーブルビューに一覧表示しようとしています。数ヶ月前に投稿された同様の質問があることに気づきましたが、与えられた答えをどのように利用するかがわかりません。
-(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];
}
今、私はピースを接続する必要がありますが、方法がわかりません。
UIAlertView
を使用するときによくある間違いは、show
メッセージを送信するとメインスレッドがブロックされると考えることです。そうではありません。画面にアラートが表示されていても、コードは引き続き実行されます。したがって、渡したUITextField
の値は存在しません。
UIAlertViewDelegate
にUIViewController
を実装して、ユーザーがテキストフィールドに入力したものをすべて取得する必要があります。とはいえ、何も入力しないと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"
}
}
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
}
}
UITextView
にUIAlertView
を追加しようとしないでください。追加しないとAppleがアプリを拒否する可能性があります。
私はすでに私のアプリで同じ種類の機能を使用しました。しかし、Apple REJECTED MY APPUITextView
でUIAlertView
を使用しているためです。
– alertView:clickedButtonAtIndex:
は、UIAlertViewのデリゲートメソッドです。編集で定義したメソッドをコントローラーの実装に追加するだけで、コントローラーをAlertViewのデリゲートに設定済みなので、準備は完了です。
また、デリゲート関連の警告を回避するために、クラスヘッダーに追加します。
@interface MyViewController : UIViewController <UIAlertViewDelegate> {
...
};
挿入メソッドから[data addObject:[nameField text]];
と[mainTableView reloadData];
を削除することを忘れないでください。
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メソッドを使用して直接追加できます。