Xamarin iOS Typedef 绑定库问题

Xamarin iOS Bindings Libraries issue with Typedefs

我正在尝试从该项目创建一个绑定库 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,我的应用程序也会崩溃

第一名:

将导致错误的 string 更改为 NSString(并且 而不是 IntPtr):

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

现在您的解决方案中的绑定项目应该可以正确编译。

第二名:

Debug/Test 在实际设备上

默认情况下 sharpie pod XXXXX 不会 创建一个静态库,该库将在 iOS 模拟器中工作,并且它也不允许创建fat 库,您必须手动执行此操作。

如果需要,创建一个基于 iphonesimulator 的静态库:

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

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

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

非常简单的例子:

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);
}

结果: