/
CompletedTransitionContext.swift
105 lines (82 loc) · 5.36 KB
/
CompletedTransitionContext.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import UIKit
/// Описание одного из совершенных обработчиком переходов.
/// Хранится в истории, чтобы иметь возможность выполнять обратные переходы.
/// Все важные ссылки хранятся слабо, чтобы не нарушать UIKit'овый цикл управления памятью.
/// т.е. чтобы спокойно пользоваться кнопкой `< Back`, например
public struct CompletedTransitionContext {
/// идентификатор перехода
/// для точной отмены нужного перехода и возвращения на предыдущий экран через
/// ```swift
/// undoTransitionWith(transitionId:)
public let transitionId: TransitionId
/// обработчик переходов для роутера модуля, вызвавшего переход
public fileprivate(set) weak var sourceTransitionsHandler: AnimatingTransitionsHandler?
/// контроллер, на который перешли
public fileprivate(set) weak var targetViewController: UIViewController?
/// обработчик переходов для роутера модуля, на контроллер которого перешли
public let targetTransitionsHandlerBox: CompletedTransitionTargetTransitionsHandlerBox
/// параметры перехода, на которые нужно держать сильную ссылку (например, обработчик переходов SplitViewController'а)
public let storableParameters: TransitionStorableParameters?
/// параметры запуска анимации перехода
public let sourceAnimationLaunchingContextBox: SourceAnimationLaunchingContextBox
/// Все важные ссылки хранятся слабо, чтобы не нарушать UIKit'овый цикл управления памятью.
/// т.е. чтобы спокойно пользоваться кнопкой `< Back`, например, и targetViewController освободится.
/// запись об таком переходе очищается лениво
public var isZombie: Bool {
return targetViewController == nil
}
// MARK: - Init
public init?(presentationTransitionContext context: PresentationTransitionContext,
sourceTransitionsHandler: AnimatingTransitionsHandler)
{
guard !context.needsAnimatingTargetTransitionHandler else {
marshrouteAssertionFailure("заполните `targetTransitionsHandlerBox` анимирующим обработчиком переходов раньше - до выполнения самого перехода")
return nil
}
let transitionsHandlerBox = CompletedTransitionTargetTransitionsHandlerBox(
presentationTransitionTargetTransitionsHandlerBox: context.targetTransitionsHandlerBox
)
guard let targetTransitionsHandlerBox = transitionsHandlerBox
else { return nil }
self.transitionId = context.transitionId
self.sourceTransitionsHandler = sourceTransitionsHandler
self.targetViewController = context.targetViewController
self.targetTransitionsHandlerBox = targetTransitionsHandlerBox
self.storableParameters = context.storableParameters
self.sourceAnimationLaunchingContextBox = .presentation(
launchingContextBox: context.presentationAnimationLaunchingContextBox
)
}
public init?(resettingTransitionContext context: ResettingTransitionContext,
sourceTransitionsHandler: AnimatingTransitionsHandler)
{
let transitionsHandlerBox = CompletedTransitionTargetTransitionsHandlerBox(
resettingTransitionTargetTransitionsHandlerBox: context.targetTransitionsHandlerBox
)
guard let targetTransitionsHandlerBox = transitionsHandlerBox
else { return nil }
self.transitionId = context.transitionId
self.sourceTransitionsHandler = sourceTransitionsHandler
self.targetViewController = context.targetViewController
self.targetTransitionsHandlerBox = targetTransitionsHandlerBox
self.storableParameters = context.storableParameters
self.sourceAnimationLaunchingContextBox = .resetting(
launchingContextBox: context.resettingAnimationLaunchingContextBox
)
}
public init(
transitionId: TransitionId,
sourceTransitionsHandler: AnimatingTransitionsHandler?,
targetViewController: UIViewController?,
targetTransitionsHandlerBox: CompletedTransitionTargetTransitionsHandlerBox,
storableParameters: TransitionStorableParameters?,
sourceAnimationLaunchingContextBox: SourceAnimationLaunchingContextBox)
{
self.transitionId = transitionId
self.sourceTransitionsHandler = sourceTransitionsHandler
self.targetViewController = targetViewController
self.targetTransitionsHandlerBox = targetTransitionsHandlerBox
self.storableParameters = storableParameters
self.sourceAnimationLaunchingContextBox = sourceAnimationLaunchingContextBox
}
}