Использование 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
}
Это правильно, в настоящее время мы автоматически не отвечаем да, чтобы соответствовать протоколам протокола для таких протоколов (но мы будем). –
Это, похоже, не добавляется. Любые обновления по этому поводу? – James