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);
}
结果:
我正在尝试从该项目创建一个绑定库 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);
}