用户按下了 UIAlertView 上的哪个按钮?

Posted

技术标签:

【中文标题】用户按下了 UIAlertView 上的哪个按钮?【英文标题】:Which button on my UIAlertView did the user press? 【发布时间】:2013-10-21 19:31:32 【问题描述】:

我创建了一个UIAlertView,现在我想检查用户按下了哪个按钮。

我的代码是:

- (IBAction)button1 
    
        UIAlertView *alert1 = [[UIAlertView alloc] init];
        [alert1 setTitle:@"Hello"];
        [alert1 setMessage:@"Do you like smoking?"];
        [alert1 addButtonWithTitle:@"Yes"];
        [alert1 addButtonWithTitle:@"No"];
        [alert1 show];
    

如何使用 if-else 语句检查?

【问题讨论】:

【参考方案1】:

您必须将 UIAlertView 的委托设置为将处理来自 UIAlertView 本身的回调的类

例如

[alert1 setDelegate:self];

其中self 是您当前的UIViewController,它实现了协议<UIAlertViewDelegate>

当用户点击按钮时,UIAlertView 将回调您设置为委托的任何对象,在我的示例中,我们使用创建 UIAlertViewUIViewController。一旦我们得到回调,我们可以检查哪个按钮索引被点击并采取相应的行动。这是在整个 ios 开发中使用的基本委托模式,尤其是 UIKit。

示例

@interface MyViewController : UIViewController() <UIAlertViewDelegate>
@end

@implementation MyViewController

- (IBAction)button1 
    
        UIAlertView *alert1 = [[UIAlertView alloc] init];
        [alert1 setTitle:@"Hello"];
        [alert1 setMessage:@"Do you like smoking?"];
        [alert1 addButtonWithTitle:@"Yes"];
        [alert1 addButtonWithTitle:@"No"];
        [alert1 setDelegate:self];
        [alert1 show];
    


#pragma mark - UIAlertViewDelegate

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

   // Handle interaction
       switch (buttonIndex)
       
           case 0:
             NSLog(@"Yes was pressed");
             break;
           case 1:
             NSLog(@"No was pressed");
             break;
       


@end

在头文件或类接口扩展中指定您的类实现&lt;UIAlertViewDelegate&gt;非常重要。

我建议您查看UIAlertViewDelegate Protocol Reference 了解更多信息,并且您可以将这种方法用于许多其他 UIKit 组件。

【讨论】:

我知道这是一岁了,但即使是我发现的一些旧代码也不起作用。 iOS 8.1 和 Xcode 6.1 测试和工作! :) 虽然我个人不得不再添加两个 if,但仍然应用它,并且运行得非常好!谢谢!!! 很高兴听到这个消息。尽管您现在应该考虑转到UIAlertController 我昨天在翻阅 Apple Docs 时看到了这一点。这还能用吗? UIAlertController 的工作方式略有不同,因为它是您以模态方式呈现的整个 UIViewController。绝对值得一读,但过渡很直接。【参考方案2】:

在您的视图控制器中实现UIAlertViewDelegate 协议,将其设置为UIAlertView 的委托,然后等待alertView:clickedButtonAtIndex: 事件,如下所示:

@interface MyViewController : UIViewController <UIAlertViewDelegate>
-(void)alertView:(UIAlertView *)alertView
      clickedButtonAtIndex:(NSInteger)buttonIndex;
@end

@implementation MyViewController

-(void)alertView:(UIAlertView *)alertView
    clickedButtonAtIndex:(NSInteger)buttonIndex 
    NSLog(@"Button %d clicked...", (int)buttonIndex);


@end

更改显示警报视图的代码如下:

UIAlertView *alert1 = [[UIAlertView alloc] init];
[alert1 setTitle:@"Hello"];
[alert1 setMessage:@"Do you like smoking?"];
[alert1 addButtonWithTitle:@"Yes"];
[alert1 addButtonWithTitle:@"No"];
alert1.delegate = self; // <<== Add this line
[alert1 show];

【讨论】:

【参考方案3】:

补充 Jeff 的回答,我认为您必须启用另一个按钮才能在单击按钮时放置您的逻辑。

为了使用您的代码创建按钮:

- (IBAction)button1 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello"
                                                        message:@"Do you like smoking?"
                                                       delegate:self
                                              cancelButtonTitle:@"Yes"
                                              otherButtonTitles:@"No", nil];
    [alert show];

但在知道点击了哪个按钮之前,您必须通过调用此委托方法来启用第一个其他按钮:

- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView

    return YES;

这将启用您创建的“否”按钮。然后,您将能够使用 clickedButtonAtIndex 方法执行一些逻辑,我想您将这样做。

实现 UIAlertView 委托方法:

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

    if (buttonIndex == 0) 
        // i love smoking!
     else if (buttonIndex == 1) 
        // i hate smoking!
    

请务必在您的标头类中声明 UIAlertViewDelegate。

确保 alertViewShouldEnableFirstOtherButton: 方法返回 YES,否则您将无法输入按钮按下时的逻辑。

希望这会有所帮助! :)

【讨论】:

感谢您的代码完全有效,只有这个有效,只有这个代码不能评价:)【参考方案4】:

您能做的最好的事情是使呈现警报视图的类符合UIAlertViewDelegate 协议并实现–alertView:clickedButtonAtIndex: 方法。这样你就知道点击了哪个按钮。

希望这会有所帮助!

【讨论】:

以上是关于用户按下了 UIAlertView 上的哪个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

cellView 中的按钮我不知道用户按下了哪个单元格

iOS如何识别按下了哪个图像(按钮)?

检测按下了哪个按钮? (然后行动)

如何在ios中的按钮数组上找到按下了哪个按钮

swift 3 在tableView 中按下了哪个单元格按钮

确定在 Swift 的自定义 listView 单元格中按下了哪个按钮