问题描述
我的理解是,UIAlertController呈现后的正常行为是等待用户响应,换句话说,暂停其他代码。
在这种情况下,当用户单击“保存”时,应该出现一个UIAlertController,向用户询问有关保存的问题,然后等待响应。但是,代码仍在继续,并且警报控制器在大约一秒钟后被关闭。
以下是什么错误导致阻止代码暂停并导致警报在大约一秒钟后消失?
-(void) save {
if (listView.text.length>=1) {
[self fireAlertNewOrUpdate];
}
// save everything else
//dismiss view controller - this line of code may be dismissing the alert controller...
}
-(void) fireAlertNewOrUpdate {
UIAlertController *listAlert = [UIAlertController alertControllerWithTitle:@"Save list as new?" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* yes = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
[self saveNewList];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Update existing" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action)
{
[self updateExisting];
}];
[listAlert addAction:cancel];
[listAlert addAction:yes];
if ([listAlert respondsToSelector:@selector(setPreferredAction:)]) {
[listAlert setPreferredAction:yes];
}
[self presentViewController:listAlert animated:YES completion:nil];
}
解决方法
您自己给出了答案,但您也将其隐藏了。 (幸运的是,您在注释中提示了它。)这是因为在save
中有一行代码被您省略了,您在其中关闭了视图控制器。该视图控制器是警报,因此警报是响应呼叫fireAlertNewOrUpdate
而出现的,然后立即再次消失。实际上,您是在一次呼吸中说present / dismiss
。
我的理解是,UIAlertController呈现后的正常行为是等待用户响应,换句话说,暂停其他代码
不,一点都不正确。实际上,恰恰相反。即使在警报出现后,您的“其他代码”也将继续显示。在iOS编程中,基本上没有任何代码会自发地“暂停”。因此,在调用present
之后,通常会出现一个视图控制器,使该代码中的无事可做。