Skip to content

Commit 2cba1e0

Browse files
authored
Fix displayed to not assume UIViewController starts not displayed (#192)
* Fix `displayed` to not assume UIViewController starts not displayed * Update changelog
1 parent 7fcee7f commit 2cba1e0

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
** *Unreleased* **:
2+
- fix: `displayed` and `rxVisible` now do not assume UIViewController starts not visible
3+
14
** Version 2.13.0 **:
25

36
- fix: use xcframeworks for RxFlow/RxFlowDemo deps to please Carthage

RxFlow/Extensions/Reactive+UIViewController.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ public extension Reactive where Base: UIViewController {
3131
var displayed: Observable<Bool> {
3232
let viewDidAppearObservable = self.sentMessage(#selector(Base.viewDidAppear)).map { _ in true }
3333
let viewDidDisappearObservable = self.sentMessage(#selector(Base.viewDidDisappear)).map { _ in false }
34-
// a UIViewController is at first not displayed
35-
let initialState = Observable.just(false)
34+
let initialState = Observable.deferred {
35+
.just(base.viewIfLoaded?.window != nil)
36+
}
3637
// future calls to viewDidAppear and viewDidDisappear will change the displayable state
3738
return initialState.concat(Observable<Bool>.merge(viewDidAppearObservable, viewDidDisappearObservable))
3839
}

RxFlowTests/UIViewController+PresentableTests.swift

+24
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,30 @@ final class UIViewController_PresentableTests: XCTestCase {
4242
}
4343
}
4444

45+
func testUIViewControllerVisibleStartsVisible() {
46+
// Given: a UIViewController that starts "displayed"
47+
let window = UIWindow()
48+
let viewController = TestUIViewController()
49+
_ = viewController.view
50+
window.rootViewController = viewController
51+
window.makeKeyAndVisible()
52+
let testScheduler = TestScheduler(initialClock: 0)
53+
let observer = testScheduler.createObserver(Bool.self)
54+
testScheduler.start()
55+
56+
// When: subscribing to rxVisible
57+
_ = viewController.rxVisible.asObservable().take(until: self.rx.deallocating).bind(to: observer)
58+
59+
// Then: rxVisible emits the first value as true
60+
let referenceVisible = [true]
61+
XCTAssertEqual(observer.events.count, 1)
62+
var index = 0
63+
referenceVisible.forEach {
64+
XCTAssertEqual(observer.events[index].value.element, $0)
65+
index += 1
66+
}
67+
}
68+
4569
func testUIViewControllerDismissed() {
4670
// Given: a UIViewController
4771
let viewController = TestUIViewController()

0 commit comments

Comments
 (0)