关闭自定义警报视图并解除 segue 问题?
Posted
技术标签:
【中文标题】关闭自定义警报视图并解除 segue 问题?【英文标题】:Dismissing custom alert view and unwind segue issue? 【发布时间】:2014-12-09 09:47:58 【问题描述】:我有一个非常具体的问题,我无法解决。我有一个使用Storyboard
和custom segues
的应用程序。
我有一个视图控制器,我必须在其中显示自定义警报视图,以确认或拒绝按下按钮时的操作。自定义警报构建为带有标题文本和 2 个用于 Confirm 和 Cancel 的按钮的视图。
在初始初始化时,我为该自定义警报视图添加观察者:
[[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 问题?的主要内容,如果未能解决你的问题,请参考以下文章