Swift Swizzled
来源:互联网 发布:货运gps数据 编辑:程序博客网 时间:2024/05/17 06:13
objc中出于安全性和一致性考虑,用+(void)load()来实现
swift中load()方法不起作用了,在swift中写load()方法编译器会提示错误,
可以用initialize() 或者是直接写在application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool
下面是在initialize() 实现的例子,修改项目中所有UIViewController的背景色
新建一个项目SwiftAlbum,为了代码修改起来方便,新建了一个AppLoad.swift文件
import UIKitextension UIViewController { public override class func initialize() { // make sure this isn't a subclass if self !== UIViewController.self { return } struct DispatchToken { static var token: dispatch_once_t = 0 } dispatch_once(&DispatchToken.token) { let originalSelector = #selector(UIViewController.viewDidLoad) let swizzledSelector = #selector(self.lw_viewDidLoad) let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) let addMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if addMethod { class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) }else { method_exchangeImplementations(originalMethod, swizzledMethod) } } } func lw_viewDidLoad() { print("viewDidLoad: \(NSStringFromClass(self.classForCoder))") let albumClassName = NSStringFromClass(self.classForCoder) if albumClassName.containsString("SwiftAlbum") { self.view.backgroundColor = UIColor.init(colorLiteralRed: 244/255, green: 244/255, blue: 244/255, alpha: 1) } }}class AppLoad: NSObject {}
通过print(“viewDidLoad:(NSStringFromClass(self.classForCoder))”)打印可以看到,项目中新建的UIViewController,都有一个工程名前缀,比如SwiftAlbum.XXXViewController
参考地址:http://nshipster.com/swift-objc-runtime/
0 0
- Swift Swizzled
- UIViewController-Swizzled【iOS源码阅读】
- UIViewController-Swizzled【iOS源码阅读】
- iOS编程重要知识之 load method swizzled
- SWIFT
- swift
- Swift
- Swift
- swift
- Swift
- swift
- Swift
- swift
- swift
- swift
- Swift
- swift
- swift
- UEFI引导模式和GPT分区形式下安装windows操作系统
- java实现的读写锁
- 创建windows service
- TextView常用属性介绍
- sysconf、pathconf和fpathconf函数
- Swift Swizzled
- Servlet的Request与Response的用法与区别
- Java公司面试题集锦(一)
- Cocos开发VR菜鸟宝典 第八讲:为GearVR开发一款深海捕鱼VR游戏
- 在Linux下禁用键盘、鼠标、触摸板(笔记本)等输入设备
- ARM、Intel、MIPS处理器啥区别?看完全懂了
- 回答“漠北黑夜”同学的问题——怎么实现切片shader?
- 人人都看得懂的正则表达式教程
- Excel操控方法之Com组件