用户按下了 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
将回调您设置为委托的任何对象,在我的示例中,我们使用创建 UIAlertView
的 UIViewController
。一旦我们得到回调,我们可以检查哪个按钮索引被点击并采取相应的行动。这是在整个 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
在头文件或类接口扩展中指定您的类实现<UIAlertViewDelegate>
非常重要。
我建议您查看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 上的哪个按钮?的主要内容,如果未能解决你的问题,请参考以下文章