2013-08-14 2 views
1

Использование Xamarin для создания библиотеки привязки для некоторого внешнего кода, я столкнулся с проблемой, которая, несмотря на (насколько я могу судить), реализую все селекторы в протоколе, в Obj-C код, мой делегат не может пройти проверку conformsToProtocol и, в результате, код не работает.Протокол привязки не проходит СоответствиеToProtocol

Вот что файл заголовка Objective-C выглядит (https://github.com/janrain/jump.ios/blob/master/Janrain/JRCapture/Classes/JRCapture.h):

@protocol JRCaptureDelegate <NSObject> 
@optional 
- (void)engageAuthenticationDialogDidFailToShowWithError:(NSError *)error; 

- (void)engageAuthenticationDidCancel; 

- (void)engageAuthenticationDidSucceedForUser:(NSDictionary *)engageAuthInfo forProvider:(NSString *)provider; 

- (void)engageAuthenticationDidFailWithError:(NSError *)error forProvider:(NSString *)provider; 

- (void)captureSignInDidSucceedForUser:(JRCaptureUser *)captureUser 
          status:(JRCaptureRecordStatus)captureRecordStatus; 

- (void)captureSignInDidFailWithError:(NSError *)error; 

- (void)registerUserDidSucceed:(JRCaptureUser *)registeredUser; 

- (void)registerUserDidFailWithError:(NSError *)error; 

- (void)refreshAccessTokenDidSucceedWithContext:(id <NSObject>)context; 

- (void)refreshAccessTokenDidFailWithError:(NSError *)error context:(id <NSObject>)context; 
@end 

А вот часть ApiDefinition.cs что ему соответствует:

[Model, BaseType (typeof (NSObject))] 
public partial interface JRCaptureDelegate { 

    [Export ("engageAuthenticationDidCancel")] 
    void EngageAuthenticationCancelled(); 

    [Export ("engageAuthenticationDidSucceedForUser:forProvider:")] 
    void AuthenticationSucceededForProvider (NSDictionary engageAuthInfo, string provider); 

    [Export ("captureSignInDidSucceedForUser:status:")] 
    void SignInSucceeded (JRCaptureUser captureUser, JRCaptureRecordStatus captureRecordStatus); 

    [Export ("registerUserDidSucceed:")] 
    void RegisterUserSucceeded(JRCaptureUser registeredUser); 

    [Export ("refreshAccessTokenDidSucceedWithContext:")] 
    void RefreshAccessTokenSucceeded(NSObject context); 

    //- (void)engageAuthenticationDialogDidFailToShowWithError:(NSError *)error 
    [Export ("engageAuthenticationDialogDidFailToShowWithError:")] 
    void DialogFailedToShow (NSError error); 

    //- (void)engageAuthenticationDidFailWithError:(NSError *)error forProvider:(NSString *)provider; 
    [Export("engageAuthenticationDidFailWithError:forProvider:")] 
    void AuthenticationFailedForProvider (NSError error, NSString provider); 

    //- (void)captureSignInDidFailWithError:(NSError *)error; 
    [Export("captureSignInDidFailWithError:")] 
    void SignInFailed (NSError error); 

    //- (void)registerUserDidFailWithError:(NSError *)error; 
    [Export("registerUserDidFailWithError:")] 
    void RegisterUserFailed (NSError error); 

    //- (void)refreshAccessTokenDidFailWithError:(NSError *)error context:(id <NSObject>)context; 
    [Export("refreshAccessTokenDidFailWithError:context:")] 
    void RefreshAccessTokenFailed (NSError error, NSObject context); 
} 

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

if ([delegate conformsToProtocol:@protocol(JRCaptureDelegate)] && 
     [delegate respondsToSelector:@selector(captureSignInDidSucceedForUser:status:)]) 

И с небольшими DLog Инг, я считаю, что мой делегат проваливает conformsToProtocol чек (хотя он проходит проверку respondsToSelector).

Так почему же мой класс сбой conformsToProtocol, когда он реализует все методы в протоколе. Что мне здесь не хватает?

Мой класс, реализующий делегат, который будет послана к различным методам, которые принимают JRCaptureDelegate выглядит так:

public class SignIn : JRCaptureDelegate 
{ 
    // overrides for each method 
} 

ответ

2

Хорошо, думаю, я мог бы взломали. Я добавил атрибут Adopts к моему классу (который неопределенно упомянут в разных местах документации Xamarin, но на самом деле не предлагается как что-то делать при создании библиотеки привязки). Так что теперь у меня есть следующее:

[Adopts("JRCaptureDelegate")] 
public class SignIn : JRCaptureDelegate 
{ 
    // overrides for each method 
} 

И теперь он проходит проверку conformsToProtocol. Я не уверен, почему это не автоматически, так как я реализую интерфейс/протокол JRCaptureDelegate.

+1

Это правильно, в настоящее время мы автоматически не отвечаем да, чтобы соответствовать протоколам протокола для таких протоколов (но мы будем). –

+1

Это, похоже, не добавляется. Любые обновления по этому поводу? – James