美文网首页iOS DeveloperiOS 开发 iOS学习
来不及编译了,快上车...插件injectionforxcode

来不及编译了,快上车...插件injectionforxcode

作者: 付寒宇 | 来源:发表于2016-03-16 01:21 被阅读2269次

项目越来越大,代码编译时间越来越长,你是不是早已经厌倦了改一点点UI布局就要重新编译一次项目的过程,我们一分钟几百万上下的,怎能被编译浪费掉珍贵的时间。

来不及解释了,快上车...哦不,让我们来尝试使用injectionforxcode这款插件,提高我们编程时的效率。

先上插件的GitHub地址:injectionforxcodeGitHub地址

效果图

效果图.gif
如果不喜欢看文字,可以观看下CocoaPods的主要贡献者之一Orta Therox(@orta)录制的一段使用视频,说得也比较有趣,会让你有感同身受的感觉。视频链接(需要科学上网姿势)

安装

下载插件后在目录下进入InjectionPluginLite文件夹,并运行InjectionPlugin.xcodeproj后重启Xcode。

再次打开Xcode我们可以看到Product菜单下多出了两个选项


Product.png

这样我们就安装成功了,让我们来新建一个工程测试一下这个插件的效果怎么样。

实验

我们在ViewController中放入一个Label在viewDidLoad中给它赋值

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.testLabel setText:@"FuhanyuTestString"];
}
第一次运行.png

然后我们修改viewDidLoad方法中的代码

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.testLabel setText:@"FuhanyuTestString"];
    [self.testLabel setText:@"OtherTestString"];
}

按Control + = 后出现一个进度条,但Label的值并未发生改变。并且在日志中出现以下警告


警告.png

于是我去gitHub的issues中逐个阅读发现了相同的问题my injection doesn't work

而插件作者给出的回答是

作者回复.png 作者回复.png

也就是说需要重新在injected这个方法中调用viewDidLoad方法就可以实现了

- (void)injected{
    [self viewDidLoad];
}

那么对于警告怎么解决呢。我在另一个issues中找到了回复

无视

你可以无视他。。。

让我们来尝试一下改变后是否有效 Control + =

成功.png

搞定收工,大家晚安。

补充内容

有一位朋友提出没写那个变量控制面板的东西怎么使用,今晚研究了一下在此补充下。
阅读了怎么使用tunable_parameters后我在原有的OC工程中运行试验,显示引用的
#import "/tmp/injectionforxcode/BundleInterface.h"
文件中有一处错误,更改后还一直有一个编译错误无法解决。
于是按照文章中使用了Swift创建了一个工程,来试验。
如果使用控制面板,需要点击product->injection plug in -> path project injection 。

product->injection plug in -> path project injection.png

这样我们就自动添加了如下代码到main.m中
#ifdef DEBUG
#define INJECTION_ENABLED
#import "/tmp/injectionforxcode/BundleInterface.h"
#endif
由于在Swift中没有main.m所以我们手动创建并且桥接它
我们也可以点进去看这个类提供的方法
@interface NSObject(INParameters)
+ (INColor * INJECTION_STRONG *)inColors;
+ (INColor *)inColor:(int)tag;
+ (float *)inParameters;
+ (float)inParameter:(int)tag;
+ (void)inSetDelegate:(id)delegate forParameter:(int)tag;
+ (void)inSetTarget:(id)target action:(SEL)action forColor:(int)tag;
@end

然后我们在Swift中加入这段代码

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let doubleNumber = 1.322
        self.testLabel.text = "\(doubleNumber)"
        NSObject.inSetDelegate(self, forParameter: 0)
    }


    override func inParameter(tag: Int32, hasChanged value: Float) {
        self.testLabel.text = "\(value)"
    }

//    override func inColor(tag: Int32, hasChanged value: AnyObject!) {
//        self.testLabel.backgroundColor = value
//    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

效果图

效果图

这样可以在不编译的情况下更方便直观的调试一些东西吧,其他用法比如我注释掉那行颜色那个,因为不是很了解Swift就没有试验成功。

至于有朋友问StoryBoard怎么用

英语不好,我实在没看懂。不过看到作者说StoryBoard支持不是很好,我就顺着台阶下楼了,如果有朋友搞清楚,希望能分享一下。

相关文章

网友评论

    本文标题:来不及编译了,快上车...插件injectionforxcode

    本文链接:https://www.haomeiwen.com/subject/uzeqlttx.html