1

我试图添加一个UIAlertView警告用户该链接将在Safari. 然后,用户可以选择 OK(打开 url)或取消,这应该只是关闭警报并返回链接。我有三个不同UIButton的 s,其中有 3 个不同URL的 s。

现在IBAction我为所有按钮添加了一个,所有按钮都有标签(我认为我可以以某种方式使用:D)。我想- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:委托会很好用..

我的问题:应该如何UIAlertView知道URL用户点击确定要打开什么?

4

3 回答 3

1

我建议您使用UIAlertView能够跟踪更多属性的子类。我在所有项目中都这样做,而且要简单得多。

  • 一种解决方案是子类化UIAlertViewMyAlertView添加一个@property(nonatomic, retain) id userInfo;or @property(nonatomic, retain) NSURL* urlToOpen。因此,您可以将自定义数据附加到您的数据UIAlertView并在委托方法中检索它以执行您需要的任何操作。
  • 另一种解决方案,实际上是我更喜欢的解决方案,是将 Objective-C 块支持添加到UIAlertView,以便能够使用UIAlertView块 API 而不是使用delegate. 如果您UIAlertViews在同一个类和同一个委托中使用多个,这将特别有用,因为使用单个委托来处理不同的实例是一团糟。

我个人一直都在使用这种技术,因为它还通过在显示警报的代码旁边点击按钮时执行的代码,而不是在使用时将其放在完全不同的位置,从而使我的代码更具可读性委托方法。

你可以OHAlertView在 GitHub 上查看我的子类,它已经实现了这个。用法非常简单,允许您为每个警报视图使用块而不是通用委托,见下文。


使用示例

-(void)confirmOpenURL:(NSURL*)url
{
  NSString* message = [NSString string WithFormat:@"Open %@ in Safari?",
                                                  url.absoluteString];
  [OHAlertView showAlertWithTitle:@"Open URL"
                          message:message
                     cancelButton:@"No"
                         okButton:@"Yes"
                   onButtonTapped:^(OHAlertView* alert, NSInteger buttonIndex)
  {
    if (buttonIndex != alert.cancelButtonIndex)
    {
       // If user tapped "Yes" and not "No"
       [[UIApplication sharedApplication] openURL:url];
    }
  }];
}

然后每个按钮都可以有自己的动作:

-(IBAction)button1Action
{
  [self confirmOpenURL:[NSURL URLWithString:@"http://www.google.com"]];
}
-(IBAction)button2Action
{
  [self confirmOpenURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];
}

或者,您可以为所有按钮打开 URL 设置一个通用 IBAction:

-(IBAction)commonButtonAction:(UIButton*)sender
{
   NSUInteger tag = sender.tag;
   NSString* urls[] = { @"http://www.google.com", @"http://www.stackoverflow.com" };
   NSURL* buttonURL = [NSURL URLWithString: urls[tag] ]; // in practice you should check that tag is between 0 and the number of urls to be sure, that's just an example here
   [self confirmOpenURL:buttonURL];
}
于 2012-09-14T13:21:50.857 回答
1

像这样解决它:tag在创建UIAlertView. 像这样:

- (IBAction)PressedButton {

    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Link"
                                                      message:@"Want to open in safari?"
                                                     delegate:self
                                            cancelButtonTitle:@"Ok"
                                            otherButtonTitles:nil];

    message.tag = 2;        //different tag for each button

    [message addButtonWithTitle:@"Cancel"];
    [message show];

}

然后当- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex委托被抛出时,我这样做了:

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

    if (buttonIndex == alertView.cancelButtonIndex){

        if (alertView.tag == 1)
        {
            //go to URL1
        }

        else if (alertView.tag == 2)
        {
             //go to URL2
        }

        else if (alertView.tag == 3)
        {
            //go to URL3
        }

    }
}
于 2012-09-14T14:23:50.757 回答
0

您的按钮操作方法应具有如下签名:

 -(void)doSomething:(id)sender;

其中发件人将是按钮。基于此,您可以找出所指的 URL。

于 2012-09-14T12:55:37.120 回答