在野生动物园开放前确认

时间:2012-09-14 12:45:32

标签: objective-c cocoa-touch

我正在尝试添加UIAlertView来警告用户该链接将在Safari中打开。然后,用户可以选择确定(打开网址)或取消应该关闭警报并返回链接。 我有三个不同的UIButton,它有3个不同的URL s。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

您可以查看已实现此功能的OHAlertView subclass here on 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"]];
}

或者,您可以为打开网址的所有按钮设置一个共同的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];
}

答案 1 :(得分: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
        }

    }
}

答案 2 :(得分:0)

你的按钮动作方法应该有这样的签名:

 -(void)doSomething:(id)sender;

发件人将成为按钮。基于此,您可以找到意味着哪个URL。