我很难让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中这样做?'。主要是因为我想将这个代码分开,所以我可以在我的应用程序的多个地方使用它。但也因为这是一个较大的逻辑块的一小部分,这对于它自己是有意义的。
任何想法我做错了什么?
谢谢, 富
答案 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];
});