我有2个视图控制器,ViewController
1(VC1)和2(VC2)。在VC2中,我有一个后退和完成按钮。在单击后退按钮时,它直接进入VC1并在完成后进行api调用,当它获得响应时,它会显示一个警报视图,然后单击确定返回到VC1。现在,当我进行api调用时,加载栏会显示并在我收到响应时消失并显示AlertView
。但是如果在这段时间内加载消失并且如果我点击后面会弹出AlertView
并且视图变为VC1,则警报会出现在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];
}
}
答案 0 :(得分:1)
解决此问题的正确方法是使用实例变量来保留对警报视图的引用。
此实例变量应在nil
委托方法中设置为alertView:didDismissWithButtonIndex:
。
在视图控制器的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;
}
}