关闭以编程方式呈现在嵌套在 NavigationController 中的 ViewController 中的 ViewController 崩溃,但并非每次

Posted

技术标签:

【中文标题】关闭以编程方式呈现在嵌套在 NavigationController 中的 ViewController 中的 ViewController 崩溃,但并非每次【英文标题】:Dismiss ViewController which was programmatically presented in ViewController nested in NavigationController crashes, but not every time 【发布时间】:2016-12-03 14:57:35 【问题描述】:

当我尝试关闭以编程方式呈现在嵌套在 NavigationController 中的 ViewController 中的 ViewController 时,我似乎得到了一个

libc++abi.dylib:以 NSException 类型的未捕获异常终止

每隔一段时间,不提供更多信息。

我的 ViewController 以模态方式呈现在嵌套的 ViewController 之上:

class RefreshController: UIViewController 

@IBOutlet var label: UILabel!
@IBOutlet var main: UIView!
@IBOutlet var spinner: UIActivityIndicatorView!



override func viewDidLoad() 
    super.viewDidLoad()
    
    spinner.startAnimating()
    label.text = .localized("refreshing") + " ..."
    
    main.layer.cornerRadius = 5


public func hideRefresh(_ contr: UIViewController, completion: @escaping (() -> Swift.Void))
    contr.presentedViewController?.dismiss(animated: true, completion: 
        refreshController = nil
        completion()
    )


class func showRefresh(_ contr: UIViewController!, completion: @escaping (() -> Swift.Void))
    refreshController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "refreshController") as! RefreshController
    
    contr.present(refreshController, animated: true, completion: 
        completion()
    )


我有一个全局变量 refreshController,当它显示为每次都可以访问它时,它将自己定义为当前呈现的控制器。

在我调用的嵌套 ViewController 中:

refreshController.hideRefresh(self, completion: 
//code goes here, after the controller dismissed

(完成部分是由于动画,有时会与应该呈现的 UIAlerts 冲突)

有人有这方面的经验吗?还是只是最新 ​​ios 10.2 (14C82) beta 中的一个 bug?

【问题讨论】:

【参考方案1】:

在呈现的视图控制器上调用dismiss,而不是在呈现的视图控制器上:

public func hideRefresh(_ contr: UIViewController, completion: @escaping (() -> Swift.Void))
    // instead of contr.presentedViewController?.dismiss...
    contr.dismiss(animated: true, completion: 
        refreshController = nil
        completion()
    )

【讨论】:

我得到它的工作,我认为这是由于调用的顺序

以上是关于关闭以编程方式呈现在嵌套在 NavigationController 中的 ViewController 中的 ViewController 崩溃,但并非每次的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 5.0 以编程方式创建视频 [关闭]

视图控制器以模态方式呈现/关闭时的通知?

在 indexpath.item 以编程方式呈现 UIViewController(嵌入在 UITabBarController 中)

以编程方式在 UITabBarController 和 UINavigationController 中呈现视图

在 Magnolia CMS 中以编程方式呈现模板区域

以编程方式将 UICollectionView 嵌套在 UIVIew 中