1

如果按下警报上的按钮或按下键盘上的返回键,我想运行相同的代码。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 适用于警报上的 OK 按钮,但我找不到返回键的等效项。

我一直在尝试- (BOOL)textFieldShouldReturn:(UITextField *)alertTextField,无济于事。

一年前,本站评论中的三个人有同样的问题,没有得到回答:

如何让 alertview 响应键盘上的“Return”,其结果与点击“OK”按钮的结果相同?我似乎在 Google 上找不到任何适用于 iOS 5 SDK 的内容。

完成此操作所需的所有步骤是什么?

编辑:

进一步来说:

- (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; 

更新:

根据您的评论,将 alert 作为类级别变量,

@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

我也有这个问题,提出的解决方案看起来不错,但不知何故我[alertView dismissWithClickedButtonIdex:1 animated:YES]关闭了 AlertView 但没有调用 AlertView 的委托方法

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

在单击按钮正确调用委托 UIAlertView 方法时,在键盘上按 enter 不会以编程方式触发它。我在这里想念什么?

调试显示 AlertView 的委托在 UITextFieldDelegate 方法中正确设置,所以我们在这里也不是在谈论 nil :P

于 2014-08-29T10:12:47.100 回答
0

编辑:基于更新问题的全新答案。

根据更新的问题,ACB 的答案将起作用。如果用户点击警报视图上的确定按钮,警报视图委托方法将被调用。

如果用户点击返回,文本字段的委托将被调用,这反过来会关闭警报视图,而警报视图又会调用警报视图委托方法。

因此,在这两种情况下,警报视图都会被关闭,并且在这两种情况下都会调用警报视图委托方法。

如果您不希望在点击返回键时解除警报,那么答案就不同了。在这种情况下,创建一个可以从警报视图委托方法和文本字段委托方法调用的通用方法。并且不要从文本字段委托方法中关闭警报视图。

于 2012-11-01T03:32:31.533 回答
0

有一种更简单的方法可以做到这一点,至少在 iOS 10 中是这样。我相信@iDev 的回答也有效,但我更喜欢这种基于配置的方法。

我不确定这适用于哪些其他版本的 iOS,或者在 API 文档中记录此行为的位置(例如:它不在此处)。

在键盘关闭时保持警报打开:

如果您添加两个操作,两者都具有.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

如果您正在阅读此问答,这不是您想要的行为,但它作为前后示例很有用。

.default在键盘关闭时触发处理程序:

如果您仅将其中一项操作设置为.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,所以我的取消按钮不是粗体,并指定键盘的主按钮应该是亮蓝色的“完成”样式。这些都不是执行默认处理程序所必需的,但对我来说似乎是更好的用户体验。

于 2016-08-23T16:58:25.937 回答