Created
December 5, 2019 19:42
-
-
Save ULazdins/71a2bfd474c7f6fe9d0e61a749271247 to your computer and use it in GitHub Desktop.
A way to use separate delegates for UIScrollViewDelegate and UITableViewDelegate when using UITableView. Inspired by https://gist.github.com/cdzombak/4454286
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class TableViewSplitDelegate: NSObject, UITableViewDelegate { | |
weak var scrollViewDelegate: UIScrollViewDelegate? | |
weak var tableViewDelegate: UITableViewDelegate? | |
override public func forwardingTarget(for aSelector: Selector!) -> Any? { | |
if selectorIsPartOfUIScrollViewDelegate(selector: aSelector) { | |
return scrollViewDelegate | |
} | |
if selectorIsPartOfUITableViewDelegate(selector: aSelector) { | |
return tableViewDelegate | |
} | |
return nil | |
} | |
override public func responds(to aSelector: Selector) -> Bool { | |
guard let target = forwardingTarget(for: aSelector) as AnyObject? else { | |
return super.responds(to: aSelector) | |
} | |
if target === scrollViewDelegate { | |
return target.responds(to: aSelector) | |
} else if target === tableViewDelegate { | |
return target.responds(to: aSelector) | |
} else { | |
return super.responds(to: aSelector) | |
} | |
} | |
// MARK: - Private | |
private func isInstanceMethodForProtocol(selector: Selector, `protocol`: Protocol, isRequired: Bool) -> Bool { | |
let methodDesc = protocol_getMethodDescription(`protocol`, selector, isRequired, true) | |
return methodDesc.name != nil | |
} | |
private func isInstanceMethodForProtocol(selector: Selector, `protocol`: Protocol) -> Bool { | |
return isInstanceMethodForProtocol(selector: selector, protocol: `protocol`, isRequired: true) || | |
isInstanceMethodForProtocol(selector: selector, protocol: `protocol`, isRequired: false) | |
} | |
private func selectorIsPartOfUIScrollViewDelegate(selector aSelector: Selector) -> Bool { | |
// assuming all UIScrollViewDelegate methods are instance methods | |
return isInstanceMethodForProtocol(selector: aSelector, protocol: UIScrollViewDelegate.self) | |
} | |
private func selectorIsPartOfUITableViewDelegate(selector aSelector: Selector) -> Bool { | |
// assuming all UIScrollViewDelegate methods are instance methods | |
return isInstanceMethodForProtocol(selector: aSelector, protocol: UITableViewDelegate.self) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage can be different, but I chose to subclass UITableView and handle both delegates there: