项目越来越大,代码编译时间越来越长,你是不是早已经厌倦了改一点点UI布局就要重新编译一次项目的过程,我们一分钟几百万上下的,怎能被编译浪费掉珍贵的时间。
来不及解释了,快上车...哦不,让我们来尝试使用injectionforxcode这款插件,提高我们编程时的效率。
先上插件的GitHub地址:injectionforxcodeGitHub地址
效果图
如果不喜欢看文字,可以观看下CocoaPods的主要贡献者之一Orta Therox(@orta)录制的一段使用视频,说得也比较有趣,会让你有感同身受的感觉。视频链接(需要科学上网姿势)
安装
下载插件后在目录下进入InjectionPluginLite文件夹,并运行InjectionPlugin.xcodeproj后重启Xcode。
再次打开Xcode我们可以看到Product菜单下多出了两个选项
这样我们就安装成功了,让我们来新建一个工程测试一下这个插件的效果怎么样。
实验
我们在ViewController中放入一个Label在viewDidLoad中给它赋值
- (void)viewDidLoad {
[super viewDidLoad];
[self.testLabel setText:@"FuhanyuTestString"];
}
然后我们修改viewDidLoad方法中的代码
- (void)viewDidLoad {
[super viewDidLoad];
[self.testLabel setText:@"FuhanyuTestString"];
[self.testLabel setText:@"OtherTestString"];
}
按Control + = 后出现一个进度条,但Label的值并未发生改变。并且在日志中出现以下警告
于是我去gitHub的issues中逐个阅读发现了相同的问题my injection doesn't work
而插件作者给出的回答是
也就是说需要重新在injected这个方法中调用viewDidLoad方法就可以实现了
- (void)injected{
[self viewDidLoad];
}
那么对于警告怎么解决呢。我在另一个issues中找到了回复
你可以无视他。。。
让我们来尝试一下改变后是否有效 Control + =
搞定收工,大家晚安。
补充内容
有一位朋友提出没写那个变量控制面板的东西怎么使用,今晚研究了一下在此补充下。
阅读了怎么使用tunable_parameters后我在原有的OC工程中运行试验,显示引用的
#import "/tmp/injectionforxcode/BundleInterface.h"
文件中有一处错误,更改后还一直有一个编译错误无法解决。
于是按照文章中使用了Swift创建了一个工程,来试验。
如果使用控制面板,需要点击product->injection plug in -> path project injection 。
这样我们就自动添加了如下代码到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就没有试验成功。