Используя 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
}