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.
})
我有以下架构:
左下角的控制器是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.
})