1

アラートのボタンが押された場合、またはキーボードのリターンキーが押された場合に同じコードを実行したいと思います。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex アラートの[OK]ボタンで機能しますが、リターンキーに相当するものが見つかりません。

- (BOOL)textFieldShouldReturn:(UITextField *)alertTextField私は無駄に実験してきました。

1年前、このサイトのコメントの3人が同じ問題を抱えていて、回答されませんでした。

キーボードの「戻る」にアラートビューが応答して、「OK」ボタンをタップしたのと同じ結果になるようにするにはどうすればよいですか。GoogleでiOS5SDKのコンテンツが見つからないようです。

これを達成するために必要なすべてのステップは何ですか?

編集:

すなわち:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    [[NSUserDefaults standardUserDefaults] setObject:[alertView textFieldAtIndex:0].text forKey:@"url_preference"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

ユーザーが[OK]を押すと、そのコードが実行されます。キーボードのReturnキーに似た、単純な同等のものは何ですか?

現在、私はこれを試しています:

- (BOOL)textFieldShouldReturn:(UITextField *)alertTextField {
    [alertTextField resignFirstResponder];
    NSLog(@"test");
    return YES;
}

これは何もしません。

これが私のアラートの定義です:

-(void) noUrl {

    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Add a URL" message:@"Change it later in Settings" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Load",nil]; //If you change button name, change it in the other alertView function
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    UITextField * alertTextField = [alert textFieldAtIndex:0];
    alertTextField.keyboardType = UIKeyboardTypeURL;
    alertTextField.returnKeyType = UIReturnKeyGo;
    alertTextField.enablesReturnKeyAutomatically = YES;
    alertTextField.placeholder = @"http://www.example.com";
    [alert show];
    return;

}

別のファイルや別の場所にコードを追加する必要がある場合は、詳細を教えていただければ幸いです。

4

4 に答える 4

5

セットする

[alert textFieldAtIndex:0].delegate = self; 

その後、実装します

- (BOOL)textFieldShouldReturn:(UITextField *)alertTextField {//add any method you want to execute to here. This method will be called when user taps on the textfield in alertview.
 [alertTextField resignFirstResponder];// to dismiss the keyboard.
 [alert dismissWithClickedButtonIndex:0 animated:YES];//this is called on alertview to dismiss it.
}

またUITextFieldDelegate、.hファイルを次のように配置します。

@interface CustomViewController : UIViewController <UIAlertViewDelegate, UITextFieldDelegate> 

質問の現在の編集によると、あなたは行方不明です、

alertTextField.delegate = self; 

アップデート:

コメントに基づいて、クラスレベル変数としてアラートを作成します。

@interface CustomViewController : UIViewController <UIAlertViewDelegate, UITextFieldDelegate> {
  UIAlertView *alert;
}

次に、このメソッドを次のように変更します。

-(void) noUrl {

   alert = [[UIAlertView alloc] initWithTitle:@"Add a URL" message:@"Change it later in Settings" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Load",nil]; //If you change button name, change it in the other alertView function
   //rest of the code here...
于 2012-11-01T03:24:44.450 に答える
0

編集:更新された質問に基づくまったく新しい回答。

更新された質問に基づいて、ACBの回答が機能します。ユーザーがアラートビューの[OK]ボタンをタップすると、アラートビューのデリゲートメソッドが呼び出されます。

ユーザーがreturnをタップすると、テキストフィールドのデリゲートが呼び出され、アラートビューが閉じられ、アラートビューのデリゲートメソッドが呼び出されます。

したがって、どちらの場合もアラートビューは閉じられ、どちらの場合もアラートビューデリゲートメソッドが呼び出されます。

リターンキーをタップしたときにアラートを閉じたくない場合は、答えが異なります。この場合、アラートビューデリゲートメソッドとテキストフィールドデリゲートメソッドの両方から呼び出すことができる共通のメソッドを作成します。また、テキストフィールドデリゲートメソッドからアラートビューを閉じないでください。

于 2012-11-01T03:32:31.533 に答える
0

私もこの問題を抱えており、提示された解決策は問題ないように見えますが、どういうわけか私はAlertViewを[alertView dismissWithClickedButtonIdex:1 animated:YES]閉じますが、AlertViewのデリゲートメソッドを呼び出しません

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    //...
}

ボタンをクリックすると、デリゲートUIAlertViewメソッドが適切に呼び出されますが、キーボードのEnterキーを押しても、プログラムでトリガーされることはありません。ここで何が欠けていますか?

デバッグでは、AlertViewのデリゲートがUITextFieldDelegateメソッド内で適切に設定されていることが示されているため、ここでもnilについて話していません:P

于 2014-08-29T10:12:47.100 に答える
0

少なくともiOS10では、これを行うためのはるかに簡単な方法があります。@ iDevの答えも機能すると確信していますが、私はこの構成ベースのアプローチを好みます。

これが動作するiOSの他のバージョン、またはAPIドキュメントのどこでこの動作が文書化されているかわかりません(例:ここにはありません)。

キーボードを閉じるときにアラートを開いたままにします。

両方ともスタイルを使用して2つのアクションを追加した場合.default、キーボードを閉じてもアラートが閉じられたり、ハンドラーが呼び出されたりすることはありません。例えば:

let cancel = UIAlertAction(title: "Cancel", style: .default,  handler: nil)
let ok     = UIAlertAction(title: "Ok",     style: .default,  handler: nil)
// Both buttons are .default, so the framework doesn't know which action to take

これは、このQ&Aを読んでいる場合に必要な動作ではありませんが、前後の例として役立ちます。

.defaultキーボードの却下時にハンドラーを起動します。

アクションの1つだけをに設定した場合.default、キーボードを閉じると、デフォルトのアクションが自動的にトリガーされ、alertViewが閉じます。例えば:

let alert = UIAlertController(title: "Your Name", message: "What is your name?, preferredStyle: .alert)
// Note the `.cancel` style. This is key
let cancelBtn = UIAlertAction(title: "Cancel", style: .cancel,  handler: { (action) in print("cancel()") })
let okBtn     = UIAlertAction(title: "Ok",     style: .default, handler: { (action) in
  let text = alert.textFields?[0].text ?? ""
  print("User Entered: \(text)")
})
alert.addAction(cancelBtn)
alert.addAction(okBtn)
alert.preferredAction = okBtn // Make this button the highlighted/bold one
alert.addTextField {
  $0.returnKeyType = .done // optional, but has appearance of a dismissing button
}

キャンセルボタンが太字にならないように設定preferredActionしていて、キーボードのメインボタンを明るい青色の「完了」スタイルにするように指定していることがわかります。デフォルトのハンドラーを実行するためにこれらのどちらも必要ありませんが、私にはより良いUXのように見えます。

于 2016-08-23T16:58:25.937 に答える