Проблема библиотек Xamarin iOS Bindings с 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


person Aktar    schedule 19.01.2016    source источник


Ответы (1)


1st:

Измените string, вызвавший ошибку, на NSStringне на IntPtr):

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

Теперь проект привязки в вашем решении должен компилироваться без ошибок.

2nd:

Отладка/тестирование на реальном устройстве

По умолчанию sharpie pod XXXXX не создает статическую библиотеку, которая будет работать в симуляторе iOS, а также не позволяет создавать библиотеки fat, вам придется это сделать вручную.

При желании создайте статическую библиотеку на основе iphonesimulator:

Для этого вам нужно вручную собрать проект xcode с sdk установленным на iphonesimulator.

i.e.

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

Результат:

введите здесь описание изображения

person SushiHangover    schedule 19.01.2016