Swift 准备转场后关闭导航控制器

Swift Dismiss navigation controller after prepare for segue

我有以下架构: 右上角的控制器是SelectAlbumVC

左下角的控制器是AddPhotoVC

在 SelectAlbumVC 中我有这个代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let destination = segue.destination as? AddPhotoPostVC
        else { fatalError("unexpected view controller for segue") }
    guard let cell = sender as? AlbumListCells else { fatalError("unexpected cell for segue") }

    switch SegueIdentifier(rawValue: segue.identifier!)! {
    case .showAllPhotos:
        destination.fetchResult = allPhotos
        destination.headerTitleBtnString = cell.allPhotoTitle.text!
    case .showCollection:
        // get the asset collection for the selected row
        let indexPath = tableView.indexPath(for: cell)!
        let collection: PHCollection
        switch Section(rawValue: indexPath.section)! {
        case .smartAlbums:
            collection = smartAlbums.object(at: indexPath.row)
        case .userCollections:
            collection = userCollections.object(at: indexPath.row)
        default: return // not reached; all photos section already handled by other segue
        }

        // configure the view controller with the asset collection
        guard let assetCollection = collection as? PHAssetCollection
            else { fatalError("expected asset collection") }
        destination.fetchResult = PHAsset.fetchAssets(in: assetCollection, options: nil)
        destination.assetCollection = assetCollection
        destination.headerTitleBtnString = cell.collectionTitle.text!
        destination.isComingFromSelectAlbum = true
    }
}

所以基本上当我点击一个单元格时,将执行 segue 并将数据传递给 AddPhotoVC。 我的问题是,当执行 segue 时,与 SelectAlbumVC 关联的导航控制器不会被关闭,因此当单击 AddPhotoVC 上的关闭按钮时,SelectAlbumVC 会再次出现(它是堆栈中的最后一个控制器)。

有没有办法在调用 prepare for segue 时关闭导航控制器? 我尝试添加底部

self.navigationController?.popToRootViewController(animated: false)

但它不起作用。

任何帮助将不胜感激。

谢谢!

如果我对您的代码的理解正确,那么您正在向 AddPhotoVC 添加另一个 segue。因此,如果当您的应用程序为 运行 并且您单击 "Debug View Hierarchy"(在 Xcode 中的调试器控件下方)时,您会看到现在在原始应用程序之上有另一个 AddPhotoVC。

与其执行从 SelectPhotoVC 到 AddPhotoVC 的转场,不如考虑执行 Unwind Segue。这样你就可以传递你想要的值,并且所有以前的 VC 都将被解雇。

您正在使用(多个)两个 UINavigationController。这意味着您是 presenting 第二个屏幕而不是 pushing 它。

现在,您提到 popToRootViewController 不起作用,那是因为两个屏幕再次有两个不同的 UINavigationController。您应该 dismiss 第二个屏幕而不是 popping 它,因为您展示了它。

了解 pushing/show 和显示视图控制器之间的区别。

Push/Show --- 弹出.

现在 --- 解雇。

而不是这个self.navigationController?.popToRootViewController(animated: false)

使用这个:

self.navigationController?.dismiss(animated: true, completion: {
    // completion, do something or make it nil.
})