【问题标题】:Xamarin access to iOS binding QualtricsSurveyViewControllerXamarin 访问 iOS 绑定 QualtricsSurveyViewController
【发布时间】:2021-06-14 16:08:17
【问题描述】:

我为 iOS 创建了一个绑定库,使用 Sharpie 绑定生成了一个 APIDefintions 和 StructsAndEnums 类,添加了对绑定库的本机引用,相应地设置了框架属性,并将绑定库的本机引用添加到 iOS 项目.

在 AppDelegate 类中,我尝试初始化 ViewController,但应用程序崩溃并显示以下消息:

致命错误:对“Qualtrics.QualtricsSurveyViewController”类使用未实现的初始化程序“init(nibName:bundle:)”

这是我的 VC 代码:

public partial class QualtricsViewController : QualtricsSurveyViewController
{
    public QualtricsViewController(NSString nibNameOrNil, NSNumber bundle) : base(nibNameOrNil, bundle)
    {
        this.Init();
    }
    public QualtricsViewController(NSCoder coder) : base(coder)
    {
        base.Init();
    }
    public QualtricsViewController()
    {

    }
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var btn = UIButton.FromType(UIButtonType.System);
        btn.Frame = new CGRect(20, 200, 280, 44);
        btn.SetTitle("Click Me", UIControlState.Normal);

        var user = new UIViewController();

        btn.TouchUpInside += (sender, e) => {
            this.NavigationController.PushViewController(user, true);
        };
    }
}

在 AppDelegate 类中,我这样称呼它:

 var qualtricsVC = new QualtricsViewController(); 

我对设置 Native Bindings 比较陌生。我的 Native Binding 项目编译正确,一切似乎都很好,直到我调用 QualtricsSurveyViewController。任何帮助,将不胜感激。提前致谢!

【问题讨论】:

  • 我注意到没有参数的构造函数不会调用this.Init();base.Init();。它也不是从基类构造函数继承的——不是: base()。这可能意味着构造函数仅用于某些特殊目的,并且您需要调用其他两个构造函数之一才能使其正常工作。我相信这不是 xamarin 问题,而是一个问题“how to correctly use/subclass QualtricsSurveyViewController”。因此,请查找该类或包含它的模块/nuget/任何内容的文档。可能那些将是 native ios docs,而不是特定于 xamarin。

标签: swift objective-c xamarin xamarin.forms xamarin.ios


【解决方案1】:

该错误表明您使用视图控制器进行了不正确的初始化。

注意:如果为 viewcontroller 创建类构造函数public QualtricsViewController(nibNameOrNil, bundle),则意味着 viewcontroller 必须来自 Storyboard,我们不能以编程方式对其进行初始化。

要解决这个问题,删除构造函数应该可以。

public partial class QualtricsViewController : QualtricsSurveyViewController
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        var btn = UIButton.FromType(UIButtonType.System);
        btn.Frame = new CGRect(20, 200, 280, 44);
        btn.SetTitle("Click Me", UIControlState.Normal);

        var user = new UIViewController();

        btn.TouchUpInside += (sender, e) => {
            this.NavigationController.PushViewController(user, true);
        };
    }
}

【讨论】:

  • 确实有效。谢谢。
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2021-12-09
相关资源
最近更新 更多