Non*_*oto 1 charts objective-c cocoapods swift carthage
我一直在开发一个支持 Xcode 8.2 和 iOS8~ 的 objc 项目。
我通过 Carthage 安装了一个 swift 库(https://github.com/danielgindi/Charts),但是如果我调用该库的任何方法,应用程序就会崩溃,并出现“无法识别的选择器发送到实例”错误。
我可以通过 Cocoapods 使其工作,但是当我将 Swift 库与 Cocoapods 一起使用时,构建时间会非常慢,所以如果可能的话我想使用 Carthage。
有没有办法通过 Carthage 在 objc 项目中使用 swift 库?
基本上,我根据页面通过 Carthage 安装了 Charts 库。 https://github.com/Carthage/Carthage/blob/master/README.md
我只使用嵌入式二进制文件来添加 Charts.framework 而不是链接框架,因为它解决了启动时的崩溃问题。
有没有办法通过 Carthage 在 objc 项目中使用 swift 库?
将 Charts.framework 添加到项目设置中的嵌入式二进制文件后,您可以将 Swift 代码导入到 ObjC 中,如下所示。例如,对于名为 的示例项目ChartsObjCSample,您需要:
import "ChartsObjCSample-Swift.h"
Run Code Online (Sandbox Code Playgroud)
现在您应该能够在 ObjC 代码中使用 Charts API。
但是,有时-Swift.h不会创建上述文件,在这种情况下,您可以创建一个虚拟 Swift 文件,按照 Xcode 说明添加盐标头,然后清理,再次构建,这应该会创建该-Swift.h文件。
最后,要使用 Charts API 创建 BarChart,您可以有一个 ViewController,其分配的 Storyboard 视图类如下BarChartView所示。
然后视图控制器可以使用如下代码渲染条形图:
#import "ViewController.h"
#import "ChartsObjCSample-Swift.h"
@import Charts;
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
BarChartView* barChartView = (BarChartView*)self.view;
NSMutableArray* dataEntries = [[NSMutableArray alloc] init];
for(int i = 0; i < 100; i++) {
BarChartDataEntry* dataEntry = [[BarChartDataEntry alloc] initWithX:5.0 * arc4random_uniform(12) y:100.0];
[dataEntries addObject:dataEntry];
}
BarChartDataSet* dataSet = [[BarChartDataSet alloc] initWithValues:dataEntries label:@"Visitor Count"];
BarChartData* barChartData = [[BarChartData alloc] initWithDataSet:dataSet];
barChartView.data = barChartData;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Run Code Online (Sandbox Code Playgroud)
渲染的条形图的屏幕截图:
上述示例代码可在GitHub 上找到。
来自苹果文档:将 Swift 代码从同一目标导入 Objective-C
使用以下语法并替换适当的名称,将 Swift 代码从该目标导入到该目标内的任何 Objective-C .m 文件中:
#import "ProductModuleName-Swift.h"
Run Code Online (Sandbox Code Playgroud)