Skip to content

Commit 1edc31b

Browse files
committed
Improve DetailCoordinator presented item replacement for multiple items
1 parent af94d78 commit 1edc31b

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

Zotero/Controllers/Architecture/Coordinator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ enum SourceView {
1616
protocol Coordinator: AnyObject {
1717
var parentCoordinator: Coordinator? { get }
1818
var childCoordinators: [Coordinator] { get set }
19-
var navigationController: UINavigationController? { get }
19+
var navigationController: UINavigationController? { get set }
2020

2121
func start(animated: Bool)
2222
func childDidFinish(_ child: Coordinator)

Zotero/Scenes/Detail/DetailCoordinator.swift

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ final class DetailCoordinator: Coordinator {
290290
navigationController.present(controller, animated: true, completion: nil)
291291
}
292292

293-
func createPDFController(key: String, parentKey: String?, library: Library, url: URL, page: Int? = nil, preselectedAnnotationKey: String? = nil) -> NavigationViewController {
294-
let navigationController = NavigationViewController()
293+
func createPDFController(key: String, parentKey: String?, library: Library, url: URL, page: Int? = nil, preselectedAnnotationKey: String? = nil) -> DetailNavigationViewController {
294+
let navigationController = DetailNavigationViewController()
295295
navigationController.modalPresentationStyle = .fullScreen
296-
296+
297297
let coordinator = PDFCoordinator(
298298
key: key,
299299
parentKey: parentKey,
@@ -304,6 +304,7 @@ final class DetailCoordinator: Coordinator {
304304
navigationController: navigationController,
305305
controllers: controllers
306306
)
307+
navigationController.coordinator = coordinator
307308
coordinator.parentCoordinator = self
308309
childCoordinators.append(coordinator)
309310
coordinator.start(animated: false)
@@ -315,10 +316,14 @@ final class DetailCoordinator: Coordinator {
315316
guard let navigationController else { return }
316317
controllers.userControllers?.openItemsController.open(.pdf(libraryId: library.identifier, key: key), for: sessionIdentifier)
317318

318-
let viewControllerProvider: () -> UIViewController = {
319+
let viewControllerProvider: () -> DetailNavigationViewController = {
319320
self.createPDFController(key: key, parentKey: parentKey, library: library, url: url)
320321
}
321322
if let presentedViewController = navigationController.presentedViewController {
323+
if let presentedDetailNavigationController = presentedViewController as? DetailNavigationViewController {
324+
presentedDetailNavigationController.replaceContents(with: viewControllerProvider(), animated: false)
325+
return
326+
}
322327
guard let window = presentedViewController.view.window else { return }
323328
show(viewControllerProvider: viewControllerProvider, by: navigationController, in: window, animated: false)
324329
return
@@ -471,8 +476,8 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate {
471476
tags: [Tag],
472477
title: NoteEditorState.TitleData?,
473478
saveCallback: @escaping NoteEditorSaveCallback
474-
) -> NavigationViewController {
475-
let navigationController = NavigationViewController()
479+
) -> DetailNavigationViewController {
480+
let navigationController = DetailNavigationViewController()
476481
navigationController.modalPresentationStyle = .fullScreen
477482
navigationController.isModalInPresentation = true
478483

@@ -487,6 +492,7 @@ extension DetailCoordinator: DetailItemsCoordinatorDelegate {
487492
sessionIdentifier: sessionIdentifier,
488493
controllers: controllers
489494
)
495+
navigationController.coordinator = coordinator
490496
coordinator.parentCoordinator = self
491497
childCoordinators.append(coordinator)
492498
coordinator.start(animated: false)
@@ -947,10 +953,14 @@ extension DetailCoordinator: DetailNoteEditorCoordinatorDelegate {
947953
controllers.userControllers?.openItemsController.open(.note(libraryId: library.identifier, key: key), for: sessionIdentifier)
948954
}
949955

950-
let viewControllerProvider: () -> UIViewController = {
956+
let viewControllerProvider: () -> DetailNavigationViewController = {
951957
self.createNoteController(library: library, kind: kind, text: text, tags: tags, title: title, saveCallback: amendedSaveCallback)
952958
}
953959
if let presentedViewController = navigationController.presentedViewController {
960+
if let presentedDetailNavigationController = presentedViewController as? DetailNavigationViewController {
961+
presentedDetailNavigationController.replaceContents(with: viewControllerProvider(), animated: false)
962+
return
963+
}
954964
guard let window = presentedViewController.view.window else { return }
955965
show(viewControllerProvider: viewControllerProvider, by: navigationController, in: window, animated: false)
956966
return

Zotero/Scenes/General/Views/NavigationViewController.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,32 @@ class NavigationViewController: UINavigationController {
1313
var statusBarVisible: Bool = true
1414

1515
override var prefersStatusBarHidden: Bool {
16-
return !self.statusBarVisible
16+
return !statusBarVisible
1717
}
1818

1919
deinit {
20-
self.dismissHandler?()
20+
dismissHandler?()
21+
}
22+
}
23+
24+
class DetailNavigationViewController: NavigationViewController {
25+
weak var coordinator: Coordinator?
26+
public func replaceContents(with replacement: DetailNavigationViewController, animated: Bool) {
27+
// Set replacement properties to self.
28+
// Swap coordinators and dismiss handlers, so that the original coordinator is properly deinitialized, along with the original view controllers.
29+
// Swap also the navigation controller property of the two coordinators.
30+
// Store original
31+
let originalCoordinator = coordinator
32+
let originalDismissHandler = dismissHandler
33+
// Swap replacement to original
34+
coordinator = replacement.coordinator
35+
coordinator?.navigationController = self
36+
dismissHandler = replacement.dismissHandler
37+
statusBarVisible = replacement.statusBarVisible
38+
setViewControllers(replacement.viewControllers, animated: animated)
39+
// Swap original to replacement
40+
replacement.coordinator = originalCoordinator
41+
replacement.coordinator?.navigationController = replacement
42+
replacement.dismissHandler = originalDismissHandler
2143
}
2244
}

0 commit comments

Comments
 (0)