Skip to content

Commit 6699071

Browse files
authored
Update life-cycle on fluidPush (#88)
* Add Tests * First adding child, then load view
1 parent 0745640 commit 6699071

File tree

4 files changed

+77
-34
lines changed

4 files changed

+77
-34
lines changed

Sources/FluidInterfaceKit/Helper/FluidExtentionViewController.swift

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extension FluidExtentionViewController {
1919
_ viewController: UIViewController,
2020
target strategy: UIViewController.FluidStackFindStrategy,
2121
transition: AnyAddingTransition? = nil,
22+
afterViewDidLoad: @escaping () -> Void = {},
2223
completion: ((AddingTransitionContext.CompletionEvent) -> Void)? = nil
2324
) {
2425

@@ -40,6 +41,7 @@ extension FluidExtentionViewController {
4041
.addContentViewController(
4142
controller,
4243
transition: transition,
44+
afterViewDidLoad: afterViewDidLoad,
4345
completion: completion
4446
)
4547

@@ -59,16 +61,14 @@ extension FluidExtentionViewController {
5961
transition: AnyAddingTransition? = nil,
6062
completion: ((AddingTransitionContext.CompletionEvent) -> Void)? = nil
6163
) {
62-
63-
/// to trigger `viewDidLoad` before calling `willTransition`.
64-
viewController.loadViewIfNeeded()
65-
66-
viewController.willTransition(with: relation)
67-
64+
6865
fluidPushUnsafely(
6966
viewController,
7067
target: strategy,
71-
transition: transition
68+
transition: transition,
69+
afterViewDidLoad: { [weak viewController] in
70+
viewController?.willTransition(with: relation)
71+
}
7272
)
7373

7474
}
@@ -83,7 +83,8 @@ extension FluidExtentionViewController {
8383
fluidPushUnsafely(
8484
viewController,
8585
target: strategy,
86-
transition: transition
86+
transition: transition,
87+
afterViewDidLoad: {}
8788
)
8889

8990
}

Sources/FluidInterfaceKit/ViewController/FluidStackController.swift

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ open class FluidStackController: UIViewController {
215215
public func addContentViewController(
216216
_ viewControllerToAdd: UIViewController,
217217
transition: AnyAddingTransition?,
218+
afterViewDidLoad: @escaping () -> Void = {},
218219
completion: ((AddingTransitionContext.CompletionEvent) -> Void)? = nil
219220
) {
220221

@@ -225,16 +226,20 @@ open class FluidStackController: UIViewController {
225226

226227
assert(Thread.isMainThread)
227228

228-
/// Save current first-responder from the current displaying view controller.
229-
/// To restore it when back to this view controller as the top - ``FluidStackController/StackingPlatterView/restoreResponderState()``
230-
topItem?.saveResponderState()
231-
232-
// Trigger `viewDidLoad` explicitly.
233-
viewControllerToAdd.loadViewIfNeeded()
234-
235-
// propagate after `viewDidLoad`
236-
viewControllerToAdd.propagateStackAction(.willPush)
237-
229+
// Construct view controller chain
230+
if viewControllerToAdd.parent != self {
231+
232+
addChild(viewControllerToAdd)
233+
234+
viewControllerToAdd.view.resetToVisible()
235+
236+
viewControllerToAdd.didMove(toParent: self)
237+
238+
} else {
239+
// case of adding while removing
240+
// TODO: might something needed
241+
}
242+
238243
// set a context if not set
239244
if viewControllerToAdd.fluidStackContext == nil {
240245
let context = FluidStackContext(
@@ -245,6 +250,18 @@ open class FluidStackController: UIViewController {
245250
viewControllerToAdd.fluidStackContext = context
246251
}
247252

253+
/// Save current first-responder from the current displaying view controller.
254+
/// To restore it when back to this view controller as the top - ``FluidStackController/StackingPlatterView/restoreResponderState()``
255+
topItem?.saveResponderState()
256+
257+
// Trigger `viewDidLoad` explicitly.
258+
viewControllerToAdd.loadViewIfNeeded()
259+
260+
afterViewDidLoad()
261+
262+
// propagate after `viewDidLoad`
263+
viewControllerToAdd.propagateStackAction(.willPush)
264+
248265
let wrapperView: StackingPlatterView = {
249266
if let currentWrapperView = viewControllerToAdd.view.superview as? StackingPlatterView {
250267
// reuse
@@ -258,19 +275,6 @@ open class FluidStackController: UIViewController {
258275
return containerView
259276
}
260277
}()
261-
262-
if viewControllerToAdd.parent != self {
263-
264-
addChild(viewControllerToAdd)
265-
266-
viewControllerToAdd.view.resetToVisible()
267-
268-
viewControllerToAdd.didMove(toParent: self)
269-
270-
} else {
271-
// case of adding while removing
272-
// TODO: might something needed
273-
}
274278

275279
view.addSubview(wrapperView)
276280

Sources/FluidInterfaceKit/ViewController/FluidViewController.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,14 @@ open class FluidViewController: FluidGestureHandlingViewController, UINavigation
108108
fluidPop(transition: nil)
109109
}
110110

111+
/**
112+
Triggers by `fluidPush`, not trigger in case of adding directly into FluidStackController.
113+
Receives `StackingRelation` that specified in fluidPush parameter.
114+
Opportunities to set up according to the relation.
115+
*/
111116
open func willTransition(with relation: StackingRelation?) {
112117

113-
assert(isViewLoaded, "library is broke.")
118+
assert(isViewLoaded, "library is broke. To be done operations in here, should be run after view-did-load")
114119

115120
switch configuration.topBar {
116121
case .navigation(let navigation):
@@ -120,8 +125,7 @@ open class FluidViewController: FluidGestureHandlingViewController, UINavigation
120125
case .hidden:
121126
break
122127
}
123-
124-
128+
125129
// setting transitions and interactions accroding to the relation
126130
// TODO: Make here letting the consumer passing as a parameter.
127131
if let relation = relation {

Sources/FluidInterfaceKitTests/FluidViewControllerTests.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,40 @@ final class FluidViewControllerTests: XCTestCase {
154154
}
155155

156156
}
157+
158+
func testFluidPush() {
159+
160+
let exp = expectation(description: "viewDidLoad")
161+
exp.assertForOverFulfill = true
162+
exp.expectedFulfillmentCount = 1
163+
164+
let stack = FluidStackController()
165+
let controller = FluidViewController()
166+
167+
controller.lifecycleEventHandler = { controller, event in
168+
switch event {
169+
case .viewDidLoad:
170+
171+
XCTAssertNotNil(controller.parent)
172+
XCTAssertEqual(controller.parent, stack)
173+
174+
exp.fulfill()
175+
case .viewWillAppear:
176+
break
177+
case .viewDidAppear:
178+
break
179+
case .viewWillDisappear:
180+
break
181+
case .viewDidDisappear:
182+
break
183+
}
184+
}
185+
186+
stack.fluidPush(controller, target: .current, relation: nil)
187+
188+
wait(for: [exp], timeout: 1)
189+
190+
}
157191

158192
private func prepare(_ viewController: UIViewController) {
159193
viewController.loadViewIfNeeded()

0 commit comments

Comments
 (0)