如何为 SimplePing 显示警报?

Posted

技术标签:

【中文标题】如何为 SimplePing 显示警报?【英文标题】:How to present an alert for SimplePing? 【发布时间】:2018-05-26 09:26:49 【问题描述】:

我有两个 ViewController,一个是 ViewController,另一个是 GlobalViewController。我在 GlobalVC 中实现了 SimplePing 来检查网络连接。它工作正常,但我想在“没有互联网”时显示警报。

这是我的代码,

//In ViewController.m
- (void)viewDidAppear:(BOOL)animated 
    //Calling SimplePing 'start' function
    [_gc checkNetConnection];    


//In GlobalVC
#pragma mark - SimplePingDelegate
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error 
    NSLog(@"didFailWithError: %@", [error description]);
    NSLog(@"#####%@", error.localizedDescription);

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:@"No internet connection, please check it..." preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)  ];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
   [alert addAction:cancel];
   [alert addAction:ok];
   dispatch_async(dispatch_get_main_queue(), ^
   [self presentViewController:alert animated:YES completion:nil];
   );

我收到了这个错误,

Warning: Attempt to present <UIAlertController: 0x146045800> on <GlobalViewController: 0x145e0e510> whose view is not in the window hierarchy!

其实在这里我想发送我当前的 ViewController 来显示警报,但我不知道如何发送。

谁能告诉我用 Swift 或 Objective c 回答。

【问题讨论】:

【参考方案1】:

这是因为您的 GlobalViewController 的视图当前不在窗口中。当您导航到 ViewController 时,它已被替换。

如果您想在互联网不可用时在每个其他视图控制器中显示您的警报,您应该将警报定义为 UIViewController 上的一个类别,然后在您想要显示它时调用它。

类似这样的:

选择您的项目,然后按“Cmd + n”添加新文件。选择 Objective-C 文件

输入文件名并保存。

输入您的代码:

UIViewController+SimplePing.h

@interface UIViewController (SimplePing)
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error;
@end

UIViewController+SimplePing.m

@implementation UIViewController (SimplePing)
- (void)simplePing:(SimplePing *)pinger didFailWithError:(NSError *)error 
    NSLog(@"didFailWithError: %@", [error description]);
    NSLog(@"#####%@", error.localizedDescription);

    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:@"No internet connection, please check it..." preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)  ];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
    [alert addAction:cancel];
    [alert addAction:ok];
    dispatch_async(dispatch_get_main_queue(), ^
        [self presentViewController:alert animated:YES completion:nil];
    );

@end

现在您可以从任何视图控制器调用它。

【讨论】:

你能告诉我如何创建 UIViewController+SimplePing.h/.m 文件 当然。选择您的项目,按 cmd+n 添加新文件。在 ios 菜单中选择“Objective-C 文件”。接下来在文件类型中选择“类别”,在类中选择“UIViewController”并输入文件名。 @iOS 我已经更新了答案以说明如何添加类别。 @HAK,它没有显示警报...遇到同样的问题。非常感谢您的回答。 @iOS 在 vi​​ewDidAppear 中这样呈现:[self alert];

以上是关于如何为 SimplePing 显示警报?的主要内容,如果未能解决你的问题,请参考以下文章

如何为本地通知设置警报管理器?

如何为mesos和HAProxy进程编写prometheus警报规则。?

我将如何为多个十字架设置警报?

如何为提示从图库或相机胶卷拍照的按钮创建警报视图?

加载 WebView 页面时如何为警报对话框设置不同的标题?

iOS:当您没有权利文件时,如何为您的应用程序实施关键警报?