每当从我的 Objective-C 库中调用我的委托(delegate)的 Canceled
方法时,我都会抛出异常。
ObjCRuntime.RuntimeException: Could not find the method 'Canceled' in the type 'MCImagePicker+_MCImagePickerDelegate'. at ObjCRuntime.Runtime.FindMethod (IntPtr typeptr, IntPtr methodptr, Int32 paramCount, System.IntPtr* paramptr)
它说找不到该方法,但是该方法已在绑定(bind)中定义。这是我使用的绑定(bind):
// @protocol MCImagePickerDelegate <NSObject>
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface MCImagePickerDelegate
{
// @optional -(void)imagePicker:(MCImagePicker *)imagePicker pickedImage:(UIImage *)image;
[Export("imagePicker:pickedImage:"), EventArgs("ImagePicked")]
void PickedImage(MCImagePicker imagePicker, UIImage image);
// @optional -(void)imagePickerDidCancel:(MCImagePicker *)imagePicker;
[Export("imagePickerDidCancel:")]
void Canceled(MCImagePicker imagePicker);
}
// @interface MCImagePicker : NSObject
[BaseType(typeof(NSObject),
Delegates = new string[] { "WeakDelegate" },
Events = new Type[] { typeof(MCImagePickerDelegate) })]
interface MCImagePicker
{
[Wrap("WeakDelegate")]
MCImagePickerDelegate Delegate { get; set; }
// @property (nonatomic) id<MCImagePickerDelegate> delegate;
[NullAllowed, Export("delegate", ArgumentSemantic.Assign)]
NSObject WeakDelegate { get; set; }
// -(void)showFromController:(UIViewController *)controller completion:(void(^)(void))completion;
[Export("showFromController:completion:")]
[Async]
void ShowFromController(UIViewController controller, Action completion);
// -(void)dismiss:(void(^)(void))completion;
[Export("dismiss:")]
[Async]
void Dismiss(Action completion);
}
注意:这仅发生在 Canceled 方法中。 ImagePicked 方法被正确调用,没有任何异常。
如果我查看生成的代码,就会生成 Canceled 方法。以下是生成的代码的摘录:
[Protocol]
[Register("MCImagePickerDelegate", false)]
[Model]
public unsafe partial class MCImagePickerDelegate : NSObject, IMCImagePickerDelegate {
[Export ("imagePickerDidCancel:")]
[CompilerGenerated]
public virtual void Canceled (MCImagePicker imagePicker)
{
throw new You_Should_Not_Call_base_In_This_Method ();
}
}
#pragma warning disable 672
[Register]
sealed class _MCImagePickerDelegate : MCImagePickerDelegate {
public _MCImagePickerDelegate () { IsDirectBinding = false; }
internal EventHandler canceled;
[Preserve (Conditional = true)]
public override void Canceled (MCImagePicker imagePicker)
{
EventHandler handler = canceled;
if (handler != null){
handler (imagePicker, EventArgs.Empty);
}
}
最佳答案
回答我自己的问题,因为我找到了解决办法。
这似乎发生是因为我在委托(delegate)中的其他方法上有 EventArgs
。如果我更新绑定(bind),以便 Canceled
方法也具有 EventArgs
:
// @optional -(void)imagePickerDidCancel:(MCImagePicker *)imagePicker;
[Export("imagePickerDidCancel:"), EventArgs("ImagePicked")]
void Canceled(MCImagePicker imagePicker);
重建解决方案后,该解决方案有效。请注意,重建步骤是必要的。
我不太确定发生了什么变化以及如何解决问题,因为生成的代码完全相同(我对其进行了比较)。但这对我有用。
更新:
您只需清理并重建解决方案。这就是所需要的全部。忽略添加 EventArgs
属性的事情。 Xamarin 在构建过程中似乎存在错误。
关于ios - 在 Xamarin Objective C 绑定(bind)中调用委托(delegate)时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595142/