0

在我正在开发的应用程序中,需要自定义 UITableView 部分的页眉和页脚。为此,我想创建一个与绑定和我们的逻辑一起使用的自定义控件。

为此,我创建了一个 XIB 并添加了一个支持类,如下所示:

public partial class HeaderFooterView : MvxTableViewHeaderFooterView
{
    public static readonly NSString Key = new NSString("HeaderFooterView");
    public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);

    public HeaderFooterView(IntPtr handle) : base(handle)
    {
    }

    public override void AwakeFromNib()
    {
        base.AwakeFromNib();

        //var binding = this.CreateBindingSet<HeaderFooterView, TableViewSection>();


        //binding.Apply();
    }
}

TheMvxTableViewHeaderFooterView实际上是一个非常简单的类,将 stockUITableViewHeaderFooterViewIMvxBindable. 没有什么花哨。

但是由于某种原因,即使我在 TableViewSource 构造函数中正确注册了它:

tableView.RegisterNibForHeaderFooterViewReuse(HeaderFooterView.Nib, HeaderFooterView.Key);

并以正确的方式仅返回 Header 本身:

    public override UIView GetViewForHeader(UITableView tableView, nint section)
    {
        return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);
    }

该应用程序因以下错误而死:

2017-07-12 16:56:40.517 MyAppiOS[3833:58706] *** Assertion failure in -[UITableView _dequeueReusableViewOfType:withIdentifier:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.7.47/UITableView.m:6696
2017-07-12 16:56:40.528 MyAppiOS[3833:58706] WARNING: GoogleAnalytics 3.17 void GAIUncaughtExceptionHandler(NSException *) (GAIUncaughtExceptionHandler.m:48): Uncaught exception: invalid nib registered for identifier (HeaderFooterView) - nib must contain exactly one top level object which must be a UITableViewHeaderFooterView instance

我的 NIB 实际上包含一个根对象,即根视图本身,它被设置为HeaderFooterView类(它派生自该类,而该类MvxTableViewHeaderFooterView又派生自UITableViewHeaderFooterView)。然而它声称没有 UITableViewHeaderFooterView 实例。

为什么它不能按预期工作?

4

3 回答 3

0

这是因为return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);如果没有 HeaderFooterViews 可以重用,可以返回 null。在这种情况下,您必须创建自己的:

var view = tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);
if (view == null){
    //instantiate the nib here and set view
}

return view;
于 2017-07-13T04:02:06.247 回答
0

我建议按如下方式构建支持类:

public partial class HeaderFooterView : MvxTableViewHeaderFooterView
{
    public static readonly NSString Key = new NSString("HeaderFooterView");
    public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);

    static HeaderFooterView()
    {
        //Adding this alone should allow your tableview to properly instantiate the view.
        Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle);
    }

    public static HeaderFooterView Create()
    {
        // However you can add this static method and create and return the view yourself.
        var arr = NSBundle.MainBundle.LoadNib(nameof(HeaderFooterView ), null, null);
        var v = Runtime.GetNSObject<HeaderFooterView >(arr.ValueAt(0));
        return v;
    }

    public HeaderFooterView(IntPtr handle) : base(handle)
    {
        // Note: this .ctor should not contain any initialization logic.
    }

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

添加静态构造函数本身应该足以让您的表格视图正确实例化 Nib。但是,如果您仍然遇到类似的问题,您可以使用静态方法“创建”自己实例化笔尖,如下所示:

public override UIView GetViewForHeader(UITableView tableView, nint section)
{
    HeaderFooterView theView = HeaderFooterView.Create()
    return theView;
}

尝试这些建议,其中一个或两个都适合您。

于 2017-07-13T07:53:39.943 回答
0

好的,找到问题了。

虽然我最初的 XIB 是正确的,但由于某种原因,根对象的类型被删除了,并且 Interface Builder 拒绝接受我的。

但是使用 VS2017 for Mac,我能够设置正确的根视图类,现在一切正常。

于 2017-07-13T10:59:52.983 回答