多个 UIAlertView;每个都有自己的按钮和动作

Posted

技术标签:

【中文标题】多个 UIAlertView;每个都有自己的按钮和动作【英文标题】:Multiple UIAlertView; each with their own buttons and actions 【发布时间】:2012-03-04 08:36:00 【问题描述】:

我在 Xcode 4.3 中创建了一个视图,但我不确定如何指定多个 UIAlertView,这些 UIAlertView 有自己的按钮和单独的操作。目前,我的警报有自己的按钮,但操作相同。下面是我的代码。

-(IBAction)altdev 
    UIAlertView *alert = [[UIAlertView alloc] 

                          initWithTitle:@"titleGoesHere"
                          message:@"messageGoesHere"
                          delegate:self
                          cancelButtonTitle:@"Cancel"
                          otherButtonTitles:@"Continue", nil];
[alert show];


-(IBAction)donate 
    UIAlertView *alert = [[UIAlertView alloc] 

                          initWithTitle:@"titleGoesHere"
                          message:@"messageGoesHere"
                          delegate:self
                          cancelButtonTitle:@"Cancel"
                          otherButtonTitles:@"Continue", nil];
    [alert show];


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    if (buttonIndex == 1) 
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.examplesite1.com"]];
         



-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    if (buttonIndex == 1) 
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"examplesite2.com"]];
    
  

感谢您的帮助!

【问题讨论】:

【参考方案1】:

UIView 有一个有用的属性tag(这是UIAlertView 的子类)。您可以为每个警报视图设置不同的标签。

更新:

#define TAG_DEV 1
#define TAG_DONATE 2

- (IBAction)altdev 
    UIAlertView *alert = [[UIAlertView alloc] 

                          initWithTitle:@"titleGoesHere"
                          message:@"messageGoesHere"
                          delegate:self
                          cancelButtonTitle:@"Cancel"
                          otherButtonTitles:@"Continue", nil];
   alert.tag = TAG_DEV;
   [alert show];


- (IBAction)donate 
    UIAlertView *alert = [[UIAlertView alloc] 

                          initWithTitle:@"titleGoesHere"
                          message:@"messageGoesHere"
                          delegate:self
                          cancelButtonTitle:@"Cancel"
                          otherButtonTitles:@"Continue", nil];
    alert.tag = TAG_DONATE;
    [alert show];


-(void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex 
    if (alertView.tag == TAG_DEV)  // handle the altdev
      ...
     else if (alertView.tag == TAG_DONATE) // handle the donate

    

【讨论】:

我仍然不明白我是如何整合它的。当我尝试将其放入时,无论我做什么,我都会不断收到 Use of undeclared identifier 错误。如果您能回复我显示的代码和您的编辑,我将不胜感激。谢谢 非常感谢,效果很好。我敢肯定,你可以说我在这方面还没有很好的经验,很高兴有像你这样的人来帮助我们。 嗯,实际上,当用户点击取消按钮时,我遇到了一个问题,即警报没有取消(只是继续执行任一按钮的操作)。有什么见解吗? 我添加了另一个选项,但我喜欢这个,所以增加了它。不要用 0 定义标签,因为这是所有对象的默认标签(当然,除非您需要默认标签)。我假设你现在已经用取消的东西解决了这个问题,但这是因为你仍然需要测试按钮。【参考方案2】:

更简单和更新

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 1;

UIAlertView *alert = [[UIAlertView alloc] init...
alert.tag = 2;



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    if(alertView.tag == 1) 
        // first alert...
     else  
        // sec alert...
    

全部完成!

【讨论】:

【参考方案3】:

如果您发现使用委托方法难以区分警报视图,那么您也可以使用 This Category 类为每个 AlertView 使用完成块。

Alert_ActionSheetWithBlocks

例如。

UIAlertView* alert1 = [[UIAlertView alloc] initWithTitle:@"AlertView+Block 1" message:@"WithBlocks" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];

[alert1 showWithFinishBlock:^(UIAlertView *alertView, NSInteger buttonIndex) //--AlertView1 Stuff here ];

UIAlertView* alert2 = [[UIAlertView alloc] initWithTitle:@"AlertView+Block 2" message:@"WithBlocks" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
[alert2 showWithFinishBlock:^(UIAlertView *alertView, NSInteger buttonIndex) //--AlertView2 Stuff here ];

我希望这是与标记 + 委托方法相比更简单的方法..

【讨论】:

【参考方案4】:

他是对的,但你需要补充一下:

-(void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex 
    if (alertView.tag == TAG_DEV && buttonIndex == 1)  // handle the altdev
      ...
     else if (alertView.tag == TAG_DONATE && buttonIndex == 1) // handle the donate

    

如果 buttonIndex==1 则您使用的是第一个其他按钮。 0 表示取消。但是什么都不做为0

【讨论】:

【参考方案5】:

或者您也可以这样做(检查标题名称),这只是另一种选择......不过请注意标题相同的警报!

-(IBAction)altdev 
UIAlertView *alert = [[UIAlertView alloc] 

                      initWithTitle:@"titleOneGoesHere"
                      message:@"messageGoesHere"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"Continue", nil];
[alert show];


-(IBAction)donate 
UIAlertView *alert = [[UIAlertView alloc] 

                      initWithTitle:@"titleTwoGoesHere"
                      message:@"messageGoesHere"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"Continue", nil];
[alert show];


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

if (buttonIndex == 1)

    if([[alertView title] isEqualToString:@"titleOneGoesHere"])
    
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.examplesite1.com"]];
    
    else
    
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"examplesite2.com"]];
    

【讨论】:

以上是关于多个 UIAlertView;每个都有自己的按钮和动作的主要内容,如果未能解决你的问题,请参考以下文章

多个 UIAlertView 问题

带有自定义按钮的自定义 UIAlertView

UIAlertView 灰色按钮

如何在 iOS 8 上显示没有按钮的 UIAlertView?

UIAlertView 滚动问题

UIAlertView 操作和取消按钮