在我自己的“;UITableViewController”;使方法可选

本文关键字:方法 UITableViewController 我自己 自己的 | 更新日期: 2023-09-27 18:26:23

我已经在Xamarin.iOS:中编写了我自己的UIViewController实现

public class HUDTableViewController : UIViewController, IUITableViewDataSource, IUITableViewDelegate, IDisposable
{
    private UITableView tableView;
    public UITableView TableView
    {
        get
        {
            return this.tableView;
        }
        set
        {
            this.tableView = value;
        }
    }
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        this.tableView = new UITableView();
        this.tableView.TranslatesAutoresizingMaskIntoConstraints = false;
        this.tableView.WeakDelegate = this;
        this.tableView.WeakDataSource = this;
        UIView parentView = new UIView();
        parentView.AddSubview(this.tableView);
        View = parentView;
        NSMutableDictionary viewsDictionary = new NSMutableDictionary();
        viewsDictionary["parent"] = parentView;
        viewsDictionary["tableView"] = this.tableView;
        parentView.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[tableView]|", (NSLayoutFormatOptions)0, null, viewsDictionary));
        parentView.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[tableView]|", (NSLayoutFormatOptions)0, null, viewsDictionary));
    }
    [Foundation.Export("numberOfSectionsInTableView:")]
    public virtual System.nint NumberOfSections(UIKit.UITableView tableView)
    {
        throw new NotImplementedException();
    }
    public virtual System.nint RowsInSection(UIKit.UITableView tableview, System.nint section)
    {
        throw new NotImplementedException();
    }
    public virtual UIKit.UITableViewCell GetCell(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        throw new NotImplementedException();
    }
    [Foundation.Export("tableView:didSelectRowAtIndexPath:")]
    public virtual void RowSelected(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath)
    {
        throw new NotImplementedException();
    }
    [Foundation.Export("tableView:heightForHeaderInSection:")]
    public virtual System.nfloat GetHeightForHeader(UIKit.UITableView tableView, System.nint section)
    {
        throw new NotImplementedException();
    }
    [Foundation.Export("tableView:viewForHeaderInSection:")]
    public virtual UIKit.UIView GetViewForHeader(UIKit.UITableView tableView, System.nint section)
    {
        throw new NotImplementedException();
    }
    [Foundation.Export("tableView:willDisplayCell:forRowAtIndexPath:")]
    public virtual void WillDisplay(UIKit.UITableView tableView, UIKit.UITableViewCell cell, Foundation.NSIndexPath indexPath)
    {
        throw new NotImplementedException();
    }
}

现在我想使用那个类并从中派生。其中一个派生需要GetHeightForHeaderGetViewForHeader,另一个不需要。不需要它的似乎也调用了这些函数,我得到了NotImplementedException异常。

我不知道它触发了什么,所以调用了这些方法。我可以实现GetHeightForHeader并返回UITableView.AutomaticDimension,但我应该如何处理GetViewForHeader

如何使这个类足够灵活,以便所有派生都可以使用它,并且只调用它们需要的方法?我应该在方法中放入什么而不是throw new NotImplementedException();

在我自己的“;UITableViewController”;使方法可选

简单地不实现它们。我还没有使用Xamarin,但这些方法看起来来自IUITableViewDataSourceIUITableViewDelegate,这意味着它们在适当的时候由表视图调用。在Cocoa中,这两个协议中只有两个方法被标记为必需的,根据您的示例,它将是这两个:

public virtual System.nint RowsInSection(UIKit.UITableView tableview, System.nint section);
public virtual UIKit.UITableViewCell GetCell(UIKit.UITableView tableView, Foundation.NSIndexPath indexPath);

其余部分完全是可选的,因此不需要默认实现,因为表视图已经知道如何在未实现时处理它。

从这些文档来看,Xamarin中的情况似乎也很相似,因为只有提到的两种方法被标记为IsRequired=true

如果您坚持使用这些实现,那么您应该返回尽可能中性的值。在这种情况下,什么是"中立"是另一回事,有待商榷。例如,对于报头高度,它可以是0,对于其视图,它可以为nil,但是对于单元高度,它可能是44。至少这些是Cocoa中的默认值。