在NSObject中使用UIAlertView

时间:2011-12-26 20:14:59

标签: uialertview nsobject

我很难让UIAlertView在我的自定义NSObject类中工作。在我所做的研究中,似乎应该是可能的,但这就是我遇到的问题。

首先,这是我的代码:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  NSLog(@"clickedButtonAtIndex: %d", buttonIndex);
}

-(void)testAlertView {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items"
                    message:@"List contains items.  Remove all items & delete?"
                    delegate:self
                    cancelButtonTitle:@"No"
                    otherButtonTitles:@"Yes", nil];
  [alertView show];
}

如果我将委托设置为self,则只要点击按钮,此代码就会崩溃。如果我将其设置为nil则不会调用clickedButtonAtIndex。我尝试过使用和不使用<UIAlertViewDelegate>

我知道有人会问'你为什么要在NSObject中而不是在UIViewController中这样做?'。主要是因为我想将这个代码分开,所以我可以在我的应用程序的多个地方使用它。但也因为这是一个较大的逻辑块的一小部分,这对于它自己是有意义的。

任何想法我做错了什么?

谢谢, 富

3 个答案:

答案 0 :(得分:8)

我使用ARC遇到了同样的问题。问题的根源是一样的。我通过将我的自定义NSObject放入一个“强”属性来解决它,以确保对象存在,只要调用对象(在我的情况下是一个UIVIewCOntroller)存在,所以当调用我的警报视图的委托时,我仍然有我的自定义对象周围,委托方法工作正常。

答案 1 :(得分:1)

将NSObject添加为强属性:

#import "Logout.h" // is NSObject
.
.
.
@property (nonatomic, strong) Logout *logout;

然后你将获得在你的NSObject中调用的delegate方法。

不要忘记注册UIAlertView的委托:

@interface Logout () <UIAlertViewDelegate>

并在您的方法中:

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];            

[a show];

答案 2 :(得分:0)

如果没有View Controller,如何使用UIAlertController呈现警报视图。 Detail description

是的,您只能在UIViewController类中使用UIAlertController。那么我们怎样才能在NSObject类中完成它。如果您看到上面给出的描述链接,您将得到答案。要总结以上描述:在当前窗口上方创建一个新窗口。这个新窗口将是我们显示警报的viewController。因此,使用此viewController,您可以调用方法[presentViewController: animated: completion:]

<强>答案:

dispatch_async(dispatch_get_main_queue(), ^{

                    UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

                    window.rootViewController = [UIViewController new];
                    window.windowLevel = UIWindowLevelAlert + 1;
                    NSString *msg=@“Your mssg";
                    UIAlertController* alertCtrl = [UIAlertController alertControllerWithTitle:@“Title" message:msg preferredStyle:UIAlertControllerStyleAlert];

                    [alertCtrl addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Yes",@"Generic confirm") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

                        // do your stuff
                        // very important to hide the window afterwards.                       
                        window.hidden = YES;

                    }]];

                    UIAlertAction *cancelAction= [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

                         window.hidden = YES; 

                    }];

                    [alertCtrl addAction:cancelAction];

                //http://stackoverflow.com/questions/25260290/makekeywindow-vs-makekeyandvisible

                    [window makeKeyAndVisible]; //The makeKeyAndVisible message makes a window key, and moves it to be in front of any other windows on its level
                    [window.rootViewController presentViewController:alertCtrl animated:YES completion:nil];

                });