UIAlertView 不应调用 popViewControllerAnimated

Posted

技术标签:

【中文标题】UIAlertView 不应调用 popViewControllerAnimated【英文标题】:UIAlertView should not call popViewControllerAnimated 【发布时间】:2014-07-15 11:52:30 【问题描述】:

我有一些 UITextViews 的视图。用户可以输入个人数据、姓名、姓氏、电子邮件等。 编辑完成后,用户点击右上角的“完成”和视图 导航回上一个视图,如下所示:

- (void)save:(id)sender


    [self.view.window endEditing:YES];

    if (self.data ...)
    
        [self updateUser];
        [self.navigationController popViewControllerAnimated:YES];
    


客户要求在某些字段(例如电子邮件)添加一些验证。验证后,UIAlertView 会通知数据输入无效,因此不会存储数据。我的问题是 AlertView 的 OK 按钮调用“保存”方法和 navigationController 被调用,popViewControllertAnimated 被调用。

这里的问题是我想在 UIAlertView 之后避免自动导航到前一个视图(通过 popViewControllerAnimated),更准确地说,我想留在我的编辑视图上并输入一个新的有效电子邮件。

警报视图的代码是

- (void)alertInvalid 

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@""                                                                      message:NSLocalizedString(@"res_CurrentPasswordErrorAlert",nil)
                              delegate:nil cancelButtonTitle: NSLocalizedString(@"res_OK",nil) otherButtonTitles:nil];

    [alertView show];


通过-(BOOL)textFieldShouldEndEditing:(UITextField *)textField 方法调用。 那么,如何在当前 UITextView 再次响应警报消息之后修改我的代码?

【问题讨论】:

alertView 委托方法中的设置。您必须在其中之一中调用您的保存方法。 使用UIAlertView Delegate方法。 您应该在 :dismissWithClickedButtonIndex 或在 :clickedButtonAtIndex (UIAlertView) 删除方法上导航您的视图。 在这行代码上放断点 [self.navigationController popViewControllerAnimated:YES]; 【参考方案1】:

你会想要使用 UIAlertViewDelegate。

这是参考:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html

但底线是你将实现这个方法:

(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

所以当你实现它时,检查按钮索引。根据索引,您可以控制逻辑中接下来发生的事情。

当你实例化你的 UIAlertView 时,一定要像这样设置委托:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@""                                                         
                                                    message:NSLocalizedString(@"res_CurrentPasswordErrorAlert",nil)
                                                   delegate:self // this is the key!
                                          cancelButtonTitle:NSLocalizedString(@"res_OK",nil)
                                          otherButtonTitles:nil];

【讨论】:

在 clickedButtonAtIndex 中我们需要什么代码?我只想与 UITextView 第一响应者保持相同的视图。 clickedButtonAtIndex 中你需要的代码完全取决于你想做什么。您可以对 buttonIndex 参数进行切换,然后对您的逻辑进行相应的编码。

以上是关于UIAlertView 不应调用 popViewControllerAnimated的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView 委托方法没有调用?

uialertview 多次调用[关闭]

以编程方式在索引处调用UIAlertView clickedbutton

UITextView 类中未调用 UIAlertView 委托方法

显示 UIAlertView 时处理摇动手势

如何从 UIAlertView 获取取消和调用用户操作