Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix delegations never fired on tab swipe #1086

Merged
merged 3 commits into from
Jun 6, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions Sources/iOS/TabBar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -183,13 +183,13 @@ public protocol TabBarDelegate {
@objc(_TabBarDelegate)
internal protocol _TabBarDelegate {
/**
A delegation method that is executed when the tabItem will trigger the
animation to the next tab.
A delegation method that is executed to determine if the TabBar should
transition to the next tab.
- Parameter tabBar: A TabBar.
- Parameter tabItem: A TabItem.
- Returns: A Boolean.
*/
@objc
optional func _tabBar(tabBar: TabBar, willSelect tabItem: TabItem)
func _tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool
}

@objc(TabBarStyle)
Expand Down Expand Up @@ -546,6 +546,9 @@ fileprivate extension TabBar {
return
}

guard !(false == _delegate?._tabBar(tabBar: self, shouldSelect: tabItem)) else { return }


animate(to: tabItem, isTriggeredByUserInteraction: true)
}
}
Expand Down Expand Up @@ -592,7 +595,6 @@ fileprivate extension TabBar {
*/
func animate(to tabItem: TabItem, isTriggeredByUserInteraction: Bool, completion: ((TabItem) -> Void)? = nil) {
if isTriggeredByUserInteraction {
_delegate?._tabBar?(tabBar: self, willSelect: tabItem)
delegate?.tabBar?(tabBar: self, willSelect: tabItem)
}

Expand Down
53 changes: 27 additions & 26 deletions Sources/iOS/TabsController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,6 @@ fileprivate extension TabsController {
func prepareTabBar() {
tabBar.lineAlignment = .bottom == tabBarAlignment ? .top : .bottom
tabBar._delegate = self
tabBar.delegate = self
view.addSubview(tabBar)
}

Expand Down Expand Up @@ -374,10 +373,10 @@ fileprivate extension TabsController {
switch swipeGesture.direction {
case .right:
guard (selectedIndex - 1) >= 0 else { return }
select(at: selectedIndex - 1)
internalSelect(at: selectedIndex - 1, isTriggeredByUserInteraction: true)
case .left:
guard (selectedIndex + 1) < viewControllers.count else { return }
select(at: selectedIndex + 1)
internalSelect(at: selectedIndex + 1, isTriggeredByUserInteraction: true)
default:
break
}
Expand All @@ -391,8 +390,26 @@ extension TabsController {
- Parameter at index: An Int.
*/
open func select(at index: Int) {
internalSelect(at: index, isTriggeredByUserInteraction: false)
}

/**
Transitions to the view controller that is at the given index.
- Parameter at index: An Int.
- Parameter isTriggeredByUserInteraction: A boolean indicating whether the
state was changed by a user interaction, true if yes, false otherwise.
- Returns: A boolean indicating whether the transition will take place.
*/
@discardableResult
private func internalSelect(at index: Int, isTriggeredByUserInteraction: Bool) -> Bool {
guard index != selectedIndex else {
return
return false
}

if isTriggeredByUserInteraction {
guard !(false == delegate?.tabsController?(tabsController: self, shouldSelect: viewControllers[index])) else {
return false
}
}

Motion.async { [weak self] in
Expand All @@ -402,42 +419,26 @@ extension TabsController {

s.tabBar.select(at: index)

s.transition(to: s.viewControllers[index], isTriggeredByUserInteraction: false) { [weak self] (isFinishing) in
s.transition(to: s.viewControllers[index], isTriggeredByUserInteraction: isTriggeredByUserInteraction) { [weak self] (isFinishing) in
guard isFinishing else {
return
}

self?.selectedIndex = index
}
}
return true
}
}

extension TabsController: TabBarDelegate, _TabBarDelegate {
extension TabsController: _TabBarDelegate {
@objc
func _tabBar(tabBar: TabBar, willSelect tabItem: TabItem) {
guard !(false == tabBar.delegate?.tabBar?(tabBar: tabBar, shouldSelect: tabItem)) else {
return
}
func _tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool {

guard let i = tabBar.tabItems.index(of: tabItem) else {
return
}

guard i != selectedIndex else {
return
}

guard !(false == delegate?.tabsController?(tabsController: self, shouldSelect: viewControllers[i])) else {
return
return false
}

transition(to: viewControllers[i], isTriggeredByUserInteraction: true) { [weak self] (isFinishing) in
guard isFinishing else {
return
}

self?.selectedIndex = i
}
return internalSelect(at: i, isTriggeredByUserInteraction: true)
}
}