Протокол привязки не проходит проверку соответствия ToProtocol

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

Вот как выглядит заголовочный файл 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);
}

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

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

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

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

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

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

person Matt Burland    schedule 14.08.2013    source источник


Ответы (1)


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

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

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

person Matt Burland    schedule 14.08.2013
comment
Это правильно, в настоящее время мы не отвечаем «да» автоматически на conformsToProtocol для таких протоколов (но мы это сделаем). - person Rolf Bjarne Kvinge; 15.08.2013
comment
Это все еще не кажется добавленным. Есть новости по этому поводу? - person James; 17.09.2013