Swift Swizzled

本文介绍如何在Swift中利用initialize方法实现对所有UIViewController背景色的统一设置,通过运行时方法交换技巧达到目的,适用于希望保持界面一致性的iOS应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

objc中出于安全性和一致性考虑,用+(void)load()来实现
swift中load()方法不起作用了,在swift中写load()方法编译器会提示错误,
可以用initialize() 或者是直接写在application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool

下面是在initialize() 实现的例子,修改项目中所有UIViewController的背景色
新建一个项目SwiftAlbum,为了代码修改起来方便,新建了一个AppLoad.swift文件

import UIKit

extension 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值