我正在开发一个使用UIAlertView
的项目,现在问题是我必须用UIAlertView's
替换所有UIAlertController's
,并且代码中大约有1250个。{我打算使用现有的Utility类创建一个执行此操作的函数,以下是我计划执行的操作:
+(void)showAlert:(NSString *)title errorMessage:(NSString *)msg {
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
在此之前我有以下问题:
1 - 这是否值得努力(使用UIAlertController
代替UIAlertView
)?
2 - 如何处理在数百个文件中具有标记和不同委托实现的UIAlertView's
?
3 - 上面函数的第四行给出了错误:No known class method for selector 'presentViewController:animated:completion:'
非常感谢任何帮助。
答案 0 :(得分:2)
您已使用UIAlertController
,因为UIAlertView
已被弃用。
Apple Doc说:
在iOS 8之前的iOS版本中运行的应用中,请使用 UIAlertView类向用户显示警报消息。警报 查看功能类似于但在外观上与动作不同 sheet(UIActionSheet的一个实例)。 UIAlertView在iOS中已弃用 8.(请注意,UIAlertViewDelegate也已弃用。)要在iOS 8及更高版本中创建和管理警报,请使用UIAlertController和 UIAlertControllerStyleAlert的preferredStyle。可用性
或者,您也可以这样做。在Utils
班级中,请执行以下操作:
+ (void)showAlertWithTitle:(NSString *)title message:(NSString *)msg controller:(id)controller {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[controller presentViewController:alertController animated:YES completion:nil];
}
ViewController
班级的用法:
[Utils showAlertWithTitle:@"Camera" message:@"It seems that your device doesn't support camera. " controller: self];
如果您现有的UIAlertView
有标签,那么您就可以使用UIAlertViewController
类而不是Util方法。
希望它有所帮助。
答案 1 :(得分:2)
您可以使用常见的alertcontroller类方法。以下是如何解决no.4错误的示例。基本上你也传递了想要调用alertview的viewController。
+(UIImage *)showAlert:(NSString *)title errorMessage:(NSString *)msg inViewController:(id)vc {
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
[vc presentViewController:alertController animated:YES completion:nil];
}
关于带有需要用户输入的标签的alertviews问题,要处理这些输入,您可能希望将处理程序放入并且不要让它为零并将您的方法转换为completionBlock方法:
+(UIImage *)showAlert:(NSString *)title message:(NSString *)msg inViewController:(id)vc completedWithBtnStr:(void(^)(NSString* btnString))completedWithBtnStr {
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
completedWithBtnStr(@"Yes");
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
completedWithBtnStr(@"No");
}]];
[vc presentViewController:alertController animated:YES completion:nil];
}
调用它的一个例子是
[YourClass showAlert:@"Sure?" message:@"Delete this record?" inViewController:self completedWithBtnStr:^(NSString* btnString) {
if ([btnString isEqualToString:@"Yes"]) {
// delete record
}
}];
参数btnString可以是任何东西。代码未经过测试,如果您发现错误,请通知我。
答案 2 :(得分:1)
回答你的问题:
**Invisible Proxy**
,因为UIAlertController
已被弃用。UIAlertview
上展示了这一点。出现在视图类。在这种情况下,您可以使用NSObject
window
来展示答案 3 :(得分:0)
+(void) showAlert
{
UIWindow* topWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
topWindow.rootViewController = [UIViewController new];
topWindow.windowLevel = UIWindowLevelAlert + 1;
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* okButton = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
//Handle your yes please button action here
topWindow.hidden = YES;
//your ok button action handling
}];
[alertController addAction:okButton];
[topWindow makeKeyAndVisible];
[topWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}