我建议您使用UIAlertView
能够跟踪更多属性的子类。我在所有项目中都这样做,而且要简单得多。
- 一种解决方案是子类化
UIAlertView
并MyAlertView
添加一个@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];
}