2016-04-06 3 views
2

Я использую sharpiebind команды, чтобы получить интерфейсы API для моей iOS библиотеки для xamarinНаходчивого связывание Objective-C @protocols вопрос

sharpie bind --namespace=XXX --sdk=iphoneos9.2 Headers/*.h 

Есть проблемы с @protocol привязок:

The type or namespace name `IProfileDelegate' could not be found. Are you missing an assembly reference? 

Это как это генерируется:

interface XLibrary : IProfileDelegate 
    { 
    [Wrap ("WeakProfileDelegate")] 
    [NullAllowed] 
    MB_ProfileDelegate ProfileDelegate { get; set; } 

Я понимаю, что он создает пустой ProfileDelegate, затем компилятор или что-то заполняет его методами. Но моя проблема в том, что IProfileDelegate не найден.

@protocol ProfileDelegate <NSObject> 
@required 
- (void)GetProfileFinished:(NSString*)_data; 
- (void)SetProfileFinished:(NSString*)_data; 
@end 

Разница здесь в I символ (который зарезервирован для @protocols я думаю). Как сделать sharpie генерировать правильные определения api?

Я могу удалить все префиксы I, и он компилируется успешно, но я бы предпочел исправить это, чтобы не повторять это каждый раз, когда мне нужно обновлять исходную библиотеку.

Благодаря

ответ

2

Помните, что все obj-c-протоколы действуют как интерфейс или абстрактный класс. Я рекомендую поместить «протокол, модель и установить базовый тип как nsobject», еще одна вещь - все методы или свойства, созданные как «необходимые», вам нужно указать его в качестве Аннотация

[Protocol, Model] 
[BaseType (typeof(NSObject))] 
interface myAwesomeDelegate 
{ 
    [Abstract] 
    [Export(...)] 
    void myRequiredMethod(uint param1) 

    [Export(...)] 
    void anotherMethod() 
} 

надеюсь, что это поможет вам устранить проблему

+0

Почему мы должны установить базовый тип? – awattar

+0

@awattar, потому что его класс ProfileDelegate obj-c имеет NSObject в качестве базового класса (at) protocol ProfileDelegate

+0

Но когда протокол не использует NSObject? http://stackoverflow.com/q/43126822/1142979 – awattar

-3

Согласно Objective Sharpie documentation:

В некоторых случаях эти сгенерированные файлы могут быть все, что вам нужно, однако чаще разработчик будет необходимо вручную изменить эти сгенерированные файлы, чтобы исправить любые проблемы, которые инструмент не может автоматически обрабатываться (например, те, которые отмечены значком Verify attribute).

Это означает, что вам иногда придется настраивать два сгенерированных файла ApiDefinitions.cs и StructsAndEnums.cs для устранения проблем, например, в этом случае.

Вы можете узнать больше о том, как привязки работают для протоколов Objective-C, которые аналогичны интерфейсам C#, но не совсем in the binding documentation.

+0

[проверить ...] директивы ясно, но мой вопрос был об этом префиксе я – Injectios

Смежные вопросы