Commit d603e0fa by Daniel Dahan Committed by GitHub

Merge pull request #1086 from OrkhanAlikhanov/issue-1056

Fix delegations never fired on tab swipe
parents dd741ff0 2a740022
...@@ -183,13 +183,13 @@ public protocol TabBarDelegate { ...@@ -183,13 +183,13 @@ public protocol TabBarDelegate {
@objc(_TabBarDelegate) @objc(_TabBarDelegate)
internal protocol _TabBarDelegate { internal protocol _TabBarDelegate {
/** /**
A delegation method that is executed when the tabItem will trigger the A delegation method that is executed to determine if the TabBar should
animation to the next tab. transition to the next tab.
- Parameter tabBar: A TabBar. - Parameter tabBar: A TabBar.
- Parameter tabItem: A TabItem. - Parameter tabItem: A TabItem.
- Returns: A Boolean.
*/ */
@objc func _tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool
optional func _tabBar(tabBar: TabBar, willSelect tabItem: TabItem)
} }
@objc(TabBarStyle) @objc(TabBarStyle)
...@@ -546,6 +546,9 @@ fileprivate extension TabBar { ...@@ -546,6 +546,9 @@ fileprivate extension TabBar {
return return
} }
guard !(false == _delegate?._tabBar(tabBar: self, shouldSelect: tabItem)) else { return }
animate(to: tabItem, isTriggeredByUserInteraction: true) animate(to: tabItem, isTriggeredByUserInteraction: true)
} }
} }
...@@ -592,7 +595,6 @@ fileprivate extension TabBar { ...@@ -592,7 +595,6 @@ fileprivate extension TabBar {
*/ */
func animate(to tabItem: TabItem, isTriggeredByUserInteraction: Bool, completion: ((TabItem) -> Void)? = nil) { func animate(to tabItem: TabItem, isTriggeredByUserInteraction: Bool, completion: ((TabItem) -> Void)? = nil) {
if isTriggeredByUserInteraction { if isTriggeredByUserInteraction {
_delegate?._tabBar?(tabBar: self, willSelect: tabItem)
delegate?.tabBar?(tabBar: self, willSelect: tabItem) delegate?.tabBar?(tabBar: self, willSelect: tabItem)
} }
......
...@@ -257,7 +257,6 @@ fileprivate extension TabsController { ...@@ -257,7 +257,6 @@ fileprivate extension TabsController {
func prepareTabBar() { func prepareTabBar() {
tabBar.lineAlignment = .bottom == tabBarAlignment ? .top : .bottom tabBar.lineAlignment = .bottom == tabBarAlignment ? .top : .bottom
tabBar._delegate = self tabBar._delegate = self
tabBar.delegate = self
view.addSubview(tabBar) view.addSubview(tabBar)
} }
...@@ -374,10 +373,10 @@ fileprivate extension TabsController { ...@@ -374,10 +373,10 @@ fileprivate extension TabsController {
switch swipeGesture.direction { switch swipeGesture.direction {
case .right: case .right:
guard (selectedIndex - 1) >= 0 else { return } guard (selectedIndex - 1) >= 0 else { return }
select(at: selectedIndex - 1) internalSelect(at: selectedIndex - 1, isTriggeredByUserInteraction: true)
case .left: case .left:
guard (selectedIndex + 1) < viewControllers.count else { return } guard (selectedIndex + 1) < viewControllers.count else { return }
select(at: selectedIndex + 1) internalSelect(at: selectedIndex + 1, isTriggeredByUserInteraction: true)
default: default:
break break
} }
...@@ -391,8 +390,26 @@ extension TabsController { ...@@ -391,8 +390,26 @@ extension TabsController {
- Parameter at index: An Int. - Parameter at index: An Int.
*/ */
open func select(at index: 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 { 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 Motion.async { [weak self] in
...@@ -402,7 +419,7 @@ extension TabsController { ...@@ -402,7 +419,7 @@ extension TabsController {
s.tabBar.select(at: index) 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 { guard isFinishing else {
return return
} }
...@@ -410,34 +427,18 @@ extension TabsController { ...@@ -410,34 +427,18 @@ extension TabsController {
self?.selectedIndex = index self?.selectedIndex = index
} }
} }
return true
} }
} }
extension TabsController: TabBarDelegate, _TabBarDelegate { extension TabsController: _TabBarDelegate {
@objc @objc
func _tabBar(tabBar: TabBar, willSelect tabItem: TabItem) { func _tabBar(tabBar: TabBar, shouldSelect tabItem: TabItem) -> Bool {
guard !(false == tabBar.delegate?.tabBar?(tabBar: tabBar, shouldSelect: tabItem)) else {
return
}
guard let i = tabBar.tabItems.index(of: tabItem) else { guard let i = tabBar.tabItems.index(of: tabItem) else {
return return false
}
guard i != selectedIndex else {
return
}
guard !(false == delegate?.tabsController?(tabsController: self, shouldSelect: viewControllers[i])) else {
return
} }
transition(to: viewControllers[i], isTriggeredByUserInteraction: true) { [weak self] (isFinishing) in return internalSelect(at: i, isTriggeredByUserInteraction: true)
guard isFinishing else {
return
}
self?.selectedIndex = i
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment