Xamarin iOS绑定库与Typedef一起出现问题

时间:2016-01-19 11:00:01

标签: c# ios xamarin objective-sharpie

我正在尝试从此项目https://github.com/Eclair/CircleProgressBar创建à绑定库。

我使用sharpie生成ApiDefinition.cs和.a文件。

> sharpie pod init ios CircleProgressBar
> sharpie bind

我在项目中复制了.a文件,并将生成的c#代码放在我的ApiDefinition.cs文件中。 但是生成的代码无法编译。

我认为问题在于,这些行

typedef NSString*(^StringGenerationBlock)(CGFloat progress);
typedef NSAttributedString*(^AttributedStringGenerationBlock)(CGFloat progress);

转换为这些

delegate string StringGenerationBlock (nfloat arg0);
delegate NSAttributedString AttributedStringGenerationBlock (nfloat arg0);

但编译器建议用IntPtr替换字符串,即使我这样做,即使编译项目,如果我尝试实例化CircleProgressBar,我的应用程序也会崩溃

1 个答案:

答案 0 :(得分:0)

第一

将导致错误的string更改为NSString IntPtr):

// typedef NSString * (^StringGenerationBlock)(CGFloat);
delegate NSString StringGenerationBlock (nfloat arg0);

现在,解决方案中的绑定项目应该编译没有错误。

第二

在实际设备上进行调试/测试

默认sharpie pod XXXXX 将创建一个可在iOS模拟器中运行的静态库,它也不允许创建 fat <​​/ strong>库,你必须手动完成。

根据需要创建基于iphonesimulator的静态库:

为此,您需要手动构建xcode项目,并将sdk设置为iphonesimulator

xcodebuild -project Pods.xcodeproj -target Pods -sdk iphonesimulator -configuration Debug clean build

您可以将该输出与原始.a一起使用来创建胖lib。

非常简单的例子:

if (circleProgressBar == null) {
    circleProgressBar = new CircleProgressBar ();
    circleProgressBar.Frame = new CoreGraphics.CGRect (this.View.Frame.Width / 4, this.View.Frame.Width / 4, this.View.Frame.Width / 2, this.View.Frame.Width / 2);
    circleProgressBar.ProgressBarWidth = 33.0f;
    circleProgressBar.BackgroundColor = UIColor.Clear;
    circleProgressBar.ProgressBarProgressColor = UIColor.Green;
    circleProgressBar.ProgressBarTrackColor = UIColor.Red;
    circleProgressBar.StartAngle = 0.0f;
    circleProgressBar.SetProgress (0.0f, false);
    this.Add (circleProgressBar);
} else {
    circleProgressBar.SetProgress (circleProgressBar.Progress + 0.1f, true);
}

结果:

enter image description here