从公共实用程序类中显示UIAlertController

时间:2017-05-04 09:11:47

标签: ios objective-c uialertview uialertcontroller

我正在开发一个使用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:'

非常感谢任何帮助。

4 个答案:

答案 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)

回答你的问题:

  1. 绝对值得这样做。不久之后,您必须使用**Invisible Proxy**,因为UIAlertController已被弃用。
  2. 使用块或协议在触发实用程序类中的委托方法时获取回调。
  3. 您似乎在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];
}