另一个视图控制器上的UIAlertView崩溃问题



我有两个视图控制器,ViewController 1(VC1)和2(VC2)。在VC2我有一个后退和完成按钮。在点击后退按钮,它直接到VC1和完成它使一个api调用,当它得到一个响应,它显示一个警告视图,点击ok回到VC1。现在,当我调用api时,加载条出现,当我得到响应并显示AlertView时消失。但是如果在加载消失的那一小部分时间内,如果我点击后退,视图更改为VC1, AlertView将弹出,VC1上出现警报并导致崩溃。

这是一个罕见的情况下,没有用户会故意尝试它,但我想知道如果崩溃可以不禁用后退按钮管理。我认为可以有其他的实例,这样的情况下,如果我们正在做一个异步调用,如果用户被允许使用UI,而等待响应,如果任何错误警报,应该显示在一个ViewController出现在另一个可能导致崩溃,因为该警报所引用的委托是前一个视图控制器。那么,有什么方法可以有效地处理这种崩溃吗?

//Alert View sample
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[[message objectAtIndex:1] capitalizedString] message:[message objectAtIndex:0] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] ;
[alert setTag:701];
[alert show];
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if ([alertView tag] == 701)
        if (buttonIndex == 0)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }

}

解决这个问题的正确方法是使用实例变量来保持对警报视图的引用。

这个实例变量应该在alertView:didDismissWithButtonIndex:委托方法中设置为nil

在视图控制器的dealloc方法中,如果实例变量仍然设置,则调用dismissWithClickedButtonIndex:animated:

假设_alertView是实例变量。

创建警报:

_alertView = [[UIAlertView alloc] initWithTitle:[[message objectAtIndex:1] capitalizedString] message:[message objectAtIndex:0] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] ;
[_alertView setTag:701];
[_alertView show];

更新你现有的alertView:clickedButtonAtIndex:方法:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if ([alertView tag] == 701) {
         _alertView.delegate = nil;            
         _alertView = nil;
        if (buttonIndex == 0) {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}

添加:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    _alertView = nil;
}

添加:

- (void)dealloc {
    if (_alertView) {
        _alertView.delegate = nil;
        [_alertView dismissWithClickedButtonIndex:_alertView.cancelButtonIndex animated:NO];
        _alertView = nil;
    }
}

最新更新