ios - 在 Xamarin Objective C 绑定(bind)中调用委托(delegate)时出现异常

标签 ios objective-c xamarin xamarin.ios

每当从我的 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/

相关文章:

ios - 即使应用程序处于后台模式或终止模式,如何检查是否有人进入/离开特定边界区域?

objective-c - 在 .h 文件中使用静态 NSString?

android - 在android中编写扩展View的类时出错

来自 Web 应用程序的 iOS 外部附件框架

iOS:Interface Builder 中定义的颜色与 Web View 中的颜色不同

ios - 如何以编程方式终止 iOS 中的进程

c# - MvxTabBarViewController 作为第一个 ViewController 没有出现

android - 是否有可能使基于 android webview 的应用程序在将点击解释为小拖动时不那么敏感?

ios - OnboardingItemInfo 出现 PaperOnboarding 错误

ios - 如何在 Swift3 iOS 中使用 Spotify 获取歌曲列表?