InjectionIII -- iOS的UI调试的黑魔法

目的

实现以下效果:


1781633-c108d6f54d16c575.GIF
效果图

问题

如果用纯代码写iOS 的UI,往往不能一次达到效果,不断的修改UI代码不可避免,特别是射鸡狮们死亡缠绕的时候,改一行代码运行一下,等几分钟,看下效果,然后重复n次这个动作。编译过程在上述过程中十分耗时,而安卓前端等都是修改完之后立刻能看到效果,所以相同水平的iOS开发效率比安卓慢不少。

思路

1、用xib和sb

这种方案能满足大部分需求,但是动态改变UI时就没那么好用。而且sb在多人开发时的维护成本比较高,所以笔者没有采用这种方案

2、InjectionIII

InjectionIII 是github上的一个开源项目,通过运行时替换代码达到动态刷新UI的目的

解决方案

步骤

1、 App Stroe 中下载 InjectionIII
2、在项目AppDelegate中的didFinishLaunchingWithOptions方法中添加加载代码

 #if DEBUG
       Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection10.bundle")?.load()
       #endif

3、给UIViewController 和 UIView 添加@objc injected 方法,在UIViewController与UIView中点击刷新会走该方法,通过删除重新加载子控件达到刷新目的

import Foundation
import UIKit

extension UIViewController {
    #if DEBUG
    @objc open func injected() {
        print("injected UIViewController")
        for subview in view.subviews {
            subview.removeFromSuperview()
        }
        viewDidLoad()
    }
    #endif
}

extension UIView {
    #if DEBUG
    @objc open func injected() {
        print("injected UIView")
        //find now VC
        guard let nowVC = UIApplication.shared.keyWindow?.rootViewController else {
            return
        }
        for subV in nowVC.view.subviews {
            subV.removeFromSuperview()
        }
        nowVC.viewDidLoad()
    }
    #endif
}

4、打开 InjectionIII, 选中自己的项目

1781633-7e5f6e81e9a95a2e.png
打开InjectionIII

5、修改 控制器或者View的中的代码,同时按 command + s 查看效果

1781633-c108d6f54d16c575.GIF
效果图

项目github地址

swift4 以上 : InjectionIII
oc 及 swift4 以下: injectionforxcode

猜你喜欢

转载自blog.csdn.net/weixin_33712881/article/details/87254633