Skip to content

Commit

Permalink
Merge pull request #40 from OrkhanAlikhanov/forwarding-delegates
Browse files Browse the repository at this point in the history
Fixed overridden delegates were not forwarded
  • Loading branch information
DanielDahan authored Jun 28, 2018
2 parents 2f4fb28 + 1c8b3c4 commit 0b4833d
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
3 changes: 1 addition & 2 deletions Sources/Transition/MotionTransition+Complete.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ extension MotionTransition {
transitionContext = nil
fromViewController = nil
toViewController = nil
isNavigationController = false
isTabBarController = false
transitioningViewController = nil
forceNonInteractive = false
animatingToViews.removeAll()
animatingFromViews.removeAll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extension MotionTransition: UINavigationControllerDelegate {
isPresenting = .push == operation
fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC
isNavigationController = true
transitioningViewController = navigationController

return self
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ import UIKit

extension MotionTransition: UITabBarControllerDelegate {
public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

guard false != tabBarController.previousTabBarDelegate?.tabBarController?(tabBarController, shouldSelect: viewController) else {
return false
}

if isTransitioning {
cancel(isAnimated: false)
}
Expand All @@ -54,7 +59,7 @@ extension MotionTransition: UITabBarControllerDelegate {
isPresenting = toVCIndex > fromVCIndex
fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC
isTabBarController = true
transitioningViewController = tabBarController

return self
}
Expand Down
46 changes: 44 additions & 2 deletions Sources/Transition/MotionTransition.swift
Original file line number Diff line number Diff line change
Expand Up @@ -377,11 +377,18 @@ open class MotionTransition: NSObject {
internal var forceFinishing: Bool?
internal var startingProgress: TimeInterval?

/// A weak reference to the currently transitioning view controller.
internal weak var transitioningViewController: UIViewController?

/// Indicates whether a UINavigationController is transitioning.
internal var isNavigationController = false
internal var isNavigationController: Bool {
return transitioningViewController is UINavigationController
}

/// Indicates whether a UITabBarController is transitioning.
internal var isTabBarController = false
internal var isTabBarController: Bool {
return transitioningViewController is UITabBarController
}

/// Indicates whether a UINavigationController or UITabBarController is transitioning.
internal var isContainerController: Bool {
Expand Down Expand Up @@ -423,6 +430,41 @@ open class MotionTransition: NSObject {

progressRunner.start(progress: progress * duration, duration: duration, isReversed: !isFinishing)
}

private func delegate(respondingTo selector: Selector?) -> NSObjectProtocol? {
guard let selector = selector else { return nil }

/// Workaround for recursion happening during navigationController transtion.
/// Avoiding private selectors (e.g _shouldCrossFadeBottomBars)
guard !selector.description.starts(with: "_") else { return nil }

/// Get relevant delegate according to controller type
let delegate: NSObjectProtocol? = {
if isTabBarController {
return transitioningViewController?.previousTabBarDelegate
}

if isNavigationController {
return transitioningViewController?.previousNavigationDelegate
}

return nil
}()

return true == delegate?.responds(to: selector) ? delegate : nil
}

open override func forwardingTarget(for aSelector: Selector!) -> Any? {
guard let superTarget = super.forwardingTarget(for: aSelector) else {
return delegate(respondingTo: aSelector)
}

return superTarget
}

open override func responds(to aSelector: Selector!) -> Bool {
return super.responds(to: aSelector) || nil != delegate(respondingTo: aSelector)
}
}

extension MotionTransition: MotionProgressRunnerDelegate {
Expand Down

0 comments on commit 0b4833d

Please sign in to comment.