子类UIAlertView

我试图UIAlertView的子类更好地处理我的应用程序中的错误状态。 我们遇到的麻烦是与其他的ButtonTitles零终止参数,当我创build我的子类时,它只是拿起列表中的第一个string,而不是所有的string

+ (ErrorAlertView *)displayErrorAlertViewWithTitle:(NSString *)title message:(NSString *)message delegate:(id<UIAlertViewDelegate>)delegate errorDelegate:(id<ErrorAlertViewDelegate>)errorDelegate cancelButtonTitle:(NSString *)cancelButtonTitle displayNow:(BOOL)displayNow tag:(NSUInteger)tag otherButtonTitles:(NSString *)otherButtonTitles, ...; { ErrorAlertView *errorAlertView = [[ErrorAlertView alloc] initWithTitle:title message:message delegate:delegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil]; errorAlertView.errorDelegate = errorDelegate; errorAlertView.tag = tag; if (displayNow) { [errorAlertView show]; } return [errorAlertView autorelease]; } 

如果我按照上面的方法调用以下方法:

 [ErrorAlertView displayErrorAlertViewWithTitle:[self noInternetConnectionAlertViewTitle] message:[self noInternetConnectionAlertViewMessage] delegate:self errorDelegate:errorDelegate cancelButtonTitle:@"OK" displayNow:YES tag:ErrorAlertTagInternetConnectionError @"Try again",@"Setting", nil]; 

显示UIAlertView只显示@“再试一次”button。

你不能像这样发送一组variables。

当我分类UIAlertView我做到了这一点:

 va_list args; va_start(args, otherButtonTitles); for (NSString *anOtherButtonTitle = otherButtonTitles; anOtherButtonTitle != nil; anOtherButtonTitle = va_arg(args, NSString*)) { [self addButtonWithTitle:anOtherButtonTitle]; } 

或者,您可以创build一个函数的变体,将va_list作为(单个)参数接受,然后运行上面的代码。

一般来说,在编写可变参数函数时,应该包含一个处理这个可能性的方法。 在这种情况下,Apple提供addButtonWithTitle:方法。

从UIAlertView类参考

子类化笔记

UIAlertView类旨在按原样使用,不支持子类。 这个类的视图层次是私有的,不能被修改。

但是,还有许多其他的alert视图实现,您可能会发现有用的,发布在CocoaControls上 。

而不是UIAlertView的子类,我更喜欢创build简单的类,通常只有一个show方法,需要一个委托参数。 然后委托协议具有与可用选项相对应的expression方法。

虽然这种方法导致比典型的警报视图委托方法更多的委托function,但我认为这使得代码更具可读性。

代码通常看起来像这样(Swift):

 @objc protocol DeleteUniverseAlertViewDelegate { func deleteUniverseAlertViewDidConfirmDelete(view: DeleteUniverseAlertView) } class DeleteUniverseAlertView : NSObject, UIAlertViewDelegate { private weak var delegate: DeleteUniverseAlertViewDelegate? = nil class func showWithDelegate(delegate: DeleteUniverseAlertViewDelegate) -> DeleteUniverseAlertView { let view = DeleteUniverseAlertView() view.delegate = delegate UIAlertView(title: "Delete universe?", message: "Are you really, really sure about this?", delegate: view, cancelButtonTitle: "Cancel", otherButtonTitles: "Yes, delete!").show() return view } func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) { if (buttonIndex > 0) { delegate?.deleteUniverseAlertViewDidConfirmDelete(self) } } } 

当您需要显示此警报时,只需执行协议并显示这样的自定义警报(请记住保留对警报视图的强烈参考):

 deleteAlert = DeletePlaceAlertView.showWithDelegate(self)