关闭自定义警报视图并解除 segue 问题?

Posted

技术标签:

【中文标题】关闭自定义警报视图并解除 segue 问题?【英文标题】:Dismissing custom alert view and unwind segue issue? 【发布时间】:2014-12-09 09:47:58 【问题描述】:

我有一个非常具体的问题,我无法解决。我有一个使用Storyboardcustom segues 的应用程序。

我有一个视图控制器,我必须在其中显示自定义警报视图,以确认或拒绝按下按钮时的操作。自定义警报构建为带有标题文本和 2 个用于 ConfirmCancel 的按钮的视图。

在初始初始化时,我为该自定义警报视图添加观察者:

    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(customAlertViewNotoficationHandler:)
                                                 name: constDismissCustomAlertViewNotificationLabel object:nil];

按下按钮我创建视图并使用:

[self presentViewController:vc animated:YES completion:nil];

当我按下 Cancel 时,我只是关闭视图。该方法在自定义类中实现:

-(void) doDismissAlert:(NSString*) isConfirm 

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

    //raise notification about dismiss
    [[NSNotificationCenter defaultCenter]
     postNotificationName:constDismissCustomAlertViewNotificationLabel
     object:isConfirm];


isConfirm 显示如果我按下 确认取消 按钮。

如果我确认操作,我必须调用 SOAP 服务。它在一个单独的线程中启动并返回确认结果(对于 SOAP 服务,我使用 sudzc.com)。如果没有错误,我继续使用自定义 segue 到另一个视图控制器:[self performSegueWithIdentifier: @"segRec2RecDet" sender: self];

Segue 执行外观:

- (void)perform 
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];

如果我有 Session expired 错误,我必须转到 Login 视图控制器。对于此操作,我使用[self performSegueWithIdentifier:@"unwSegReturnToLogin" sender:self]; 转到登录。这就是我的问题出现的地方。我收到错误:

2014-12-09 11:43:27.558 PA-PAY[10605:613] attempt to dismiss modal view controller
whose view does not currently appear. self = <PESvcRecharge: 0x7f9920e7d030>
modalViewController = <PESavCustomAlertView: 0x7f9920f82990>
2014-12-09 11:43:27.558 PA-PAY[10605:613] attempt to dismiss modal view controller
whose view does not currently appear. self = <PESvcLogin: 0x7f9920d37f00>
modalViewController = <PESvcRecharge: 0x7f9920e7d030>

很明显,有人试图解除已经在解除过程中的 PESavCustomAlertView,但它无法进入 PESvcLogin。

很奇怪,在模拟器中,当我使用 ios 8.1 时,上面的代码可以工作。它在 7.1 中崩溃

有什么建议可以解决吗?

编辑

我的视图层次结构如下(仅适用于这部分逻辑):

登录 VC -> 菜单 VC -> 充值 VC -> (自定义提醒) -> 票务VC

自定义警报 是必需的,因为我的规范要求它必须看起来像那样。我也可以有正常的警报视图来显示有错误。如果错误是Session expired,我必须返回Login VC

备注:自定义提醒不属于故事板。它是与我的自定义类连接的 xib 文件。

【问题讨论】:

看起来您有一堆 2 个模态视图控制器,并且它正试图同时关闭它们,但我并不清楚您的视图层次结构。如果它在 7 中崩溃但不是在 8 中崩溃,我首先想知道这是否是 UIKit 竞争条件。你试过关掉动画吗?你能发布更多关于视图堆栈的信息吗? 是的,@P-double 我有 2 个模态 VC,我想解雇它们。我不确定它是“同时”。在解雇方法的通知中,我尝试放松。我想问题是 Custom Alert 没有被解雇。 Custom Alert 也不属于 Story board 实际上我通过将关闭动画设置为NO来修复它。 10 倍的建议。 所以它看起来像一个竞争条件,在 iOS 7 中,在视图控制器之间制作动画时存在一些视图层次结构损坏的问题 一句话 - 我为 iOS > 8 设置了关闭动画为 NO Custom Alert 【参考方案1】:

关闭动画可以解决问题,但我怀疑您的视图堆栈管理代码存在更深层次的问题。模式视图控制器关闭后应该运行的代码应该添加到

的完成块中

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

允许你保留动画行为

    [self.presentingViewController dismissViewControllerAnimated:YES completion:^

        // Post notfication here

    ];

【讨论】:

我不确定我必须拥有哪种类型的发布通知。出于这个原因,@P-double,我就这样吧。

以上是关于关闭自定义警报视图并解除 segue 问题?的主要内容,如果未能解决你的问题,请参考以下文章

没有segue的自定义关闭过渡

如何在 Swift 中使用警报视图解除 segue?

自定义 Segue NavBar 后退按钮

用自定义警报视图替换对话框“打开位置服务以允许应用程序确定您的位置服务”[关闭]

如何实现自定义segue动画?

如何播放警报声音并呈现自定义视图而不仅仅是通知?