iOS9如何调用NSObject类中的UIAlertviewController?

Posted

技术标签:

【中文标题】iOS9如何调用NSObject类中的UIAlertviewController?【英文标题】:How to call UIAlertviewController in NSObject Class in iOS9? 【发布时间】:2015-10-19 06:13:44 【问题描述】:

由于在 ios9 中不推荐使用警报视图,我在通过 NSObject 类显示警报时遇到了困难 因为在 UIAlertView 中有一种方法可以显示警报 [objaler show] ;但在 iOS 9 中显示警报 我们必须使用 presentViewController 这样任何人都可以告诉我如何在 nsobject 类中显示警报视图控制器。

我想在 NSObject 类中调用的代码如下:

   UIAlertController *alert= [UIAlertController
                               alertControllerWithTitle:@"Login"
                               message:@"Enter your credentials here"
                               preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* ok = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault
                                               handler:^(UIAlertAction * action)
                                                   //Do Some action here
                                               ];
    UIAlertAction* cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault
                                                   handler:^(UIAlertAction * action) 
                                                      NSLog(@"cancel btn");
                                                       [alert dismissViewControllerAnimated:YES completion:nil];

                                                   ];
    [alert addAction:ok];
    [alert addAction:cancel];
   [self presentViewController:alert animated:YES completion:nil];


我的问题是我想在 NSObject 类中调用它。 该怎么做?

【问题讨论】:

为什么不尝试使用 NSNotification?在你的 NSObject 类上,发布一个通知,然后在 UIViewController 类上添加一个观察者,它将调用一个选择器来显示你的 UIAlertAction。 @JohnRusselUsi 好主意。 【参考方案1】:

试试这个:

你的 ObjectClassName.h 类

#import <UIKit/UIKit.h>
+ (void)showAlertTitle:(NSString *)title withMessage:(NSString *)message onView:(UIViewController *)viewController;

你的 ObjectClassName.m 类

+ (void)showAlertTitle:(NSString *)title withMessage:(NSString *)message onView:(UIViewController *)viewController

    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:title
                                  message:message
                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* okButton = [UIAlertAction
                                actionWithTitle:@"OK"
                                style:UIAlertActionStyleDefault
                                handler:^(UIAlertAction * action)
                                
                                    //Handel your yes please button action here
                                    [alert dismissViewControllerAnimated:YES completion:nil];

                                ];

    [alert addAction:okButton];

   [viewController presentViewController:alert animated:YES completion:nil];



当您调用导入您的对象类时:

#import "ObjectClassName.h";
[ObjectClassName showAlertTitle:@"Alert" withMessage:@"Alert Message" onView:self];

【讨论】:

好吧,如果他有任何可用的,OP 可以简单地将视图控制器推送到警报控制器。这并不能解决问题的关键。【参考方案2】:

这就是重点——Apple 告诉你可能不应该这样做。

在这种情况下,您可以做的最好的事情是遍历视图控制器的层次结构(从 UIWindow-rootViewController 开始),并至少将其呈现在***控制器上。

一般而言,您能做的最好的事情就是直接在适当的视图控制器中调用此类警报。

【讨论】:

我知道我们不能这样做,而且您的回答定义我们必须使用 viewControllers Hierarchy,因此您的解决方案和我的解决方案相同,我正在定义代码,而您在理论上编写. NSObject 类没有 UI 是常识,所以你不能这样做。所以请先理解问题和答案。 我理解了这个问题。下面的答案不是解决方案,它只是通过方法分配视图控制器的包装,而不是直接分配和调用它。节省了 2 行代码,但找到合适的视图控制器来呈现的问题仍然存在。【参考方案3】:

类方法不会调用您的警报视图

+(void)initialize but by the instance -(id)init method

这就是您的实例没有收到通知的原因

类方法"+(void)initialize"在类首次加载时被调用。

实例方法 "-(id)init" 的名称以 init 开头,并在您创建(实例化)对象时调用。

-(id)init  //alert view self = [super init]; return self; 

【讨论】:

以上是关于iOS9如何调用NSObject类中的UIAlertviewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何调用从 NSObject 类添加视图

在 Swift 中单击 NSObject 内部的 tableView 中的项目时,如何在 NSObject 类中的 UIViewController 上的 UIView 之间正确切换?

如何在 NSObject 类中添加动态行为:Swift

NSObject 类中的委托

从 viewController 访问 NSObject 类中的 NSMutableArray

objective-c 中如何在一个函数中调用自己类中的另外一个函数