Swift hook tableView delegate

1,969 阅读1分钟

// // UITableView-Extension.swift // SwiftDemo // // Created by 王成杰 on 2020/3/7. // Copyright © 2020 . All rights reserved. //

import Foundation
import UIKit

extension UITableView {

open class func inintClass(){
    
    guard self == UITableView.self else {
        return
    }
    
    hook(self)
}

@objc func wcj_setDelegate(delegate: UITableViewDelegate){
    
    self.wcj_setDelegate(delegate: delegate)
    exchangeTableViewDelegate(orignClass: type(of: delegate))

    print("天天涨停板")
    
}



 @objc func exchangeTableViewDelegate(orignClass: AnyClass) {
    
    wcj_exchangeMethod(originalClass:orignClass, originalSelector: #selector(UITableViewDelegate.tableView(_:didSelectRowAt:)), replacedClass: UITableView.self, replacedSelector: #selector(tableView(_:wcj_didSelectRowAt:)), addedSelector: #selector(tableView(_:addwcj_didSelectRowAt:)))
}


@objc func tableView(_ tableView: UITableView, addwcj_didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
   
    print("add100000000个涨停")

}

@objc func tableView(_ tableView: UITableView, wcj_didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    
    self.tableView(tableView, wcj_didSelectRowAt: indexPath)
    print("100000000个涨停")

}


@objc func wcj_exchangeMethod(originalClass: AnyClass , originalSelector: Selector, replacedClass: AnyClass ,replacedSelector: Selector, addedSelector: Selector){
    
    let originalMethod = class_getInstanceMethod(originalClass, originalSelector)
    let replacedMethod = class_getInstanceMethod(replacedClass, replacedSelector)
    
    guard let method = originalMethod else {
        
        let originReplacedmethod = class_getInstanceMethod(replacedClass, addedSelector)
        
        let isDidAddOriginalMethod: Bool = class_addMethod(originalClass, originalSelector, method_getImplementation(originReplacedmethod!), method_getTypeEncoding(originReplacedmethod!))
        
        if isDidAddOriginalMethod {
            
            //print("did Add Origin Replace Method")
        }
        
        
        
        return

    }
    
    
    let isDidAddMethod : Bool = class_addMethod(originalClass, replacedSelector, method_getImplementation(replacedMethod!), method_getTypeEncoding(replacedMethod!))
    
    
    if isDidAddMethod{
       
        let newMethod = class_getInstanceMethod(originalClass, replacedSelector);
        // 实现交换
        method_exchangeImplementations(originalMethod!, newMethod!);
    }else{
       
    }



}


}

private let hook:(UITableView.Type) -> () = { tableview in
swit
let originalMethod = class_getInstanceMethod(tableview, #selector(setter: tableview.delegate))
let hookedMethod = class_getInstanceMethod(tableview, #selector(tableview.wcj_setDelegate(delegate:)))

 method_exchangeImplementations(originalMethod!, hookedMethod!)

}

//!的没有加判空一定记的加判空代码