如何为TableViewSource创建通用的默认空单元格

时间:2019-05-29 11:11:57

标签: xamarin xamarin.ios

在我的应用程序中,我有很多列表,并且每次我要确保始终有一个默认单元格来确保安全。因此,每次在应用程序中创建列表时,都会在tableView中重新创建一个空单元格。

除了将XIB用于可重用性之外,我看不到任何解决方案。

1 个答案:

答案 0 :(得分:0)

您需要创建一个TableSourceBase来管理DefaultEmptyCell和应用程序公用的任何其他单元。 这里的技巧是在使用它们之前产生所有xib。否则会崩溃。

public abstract class TableViewSourceBase : UITableViewSource
    {
        protected const string DefaultEmptyCellIdentifier = "DefaultEmptyCell";

        protected virtual IEnumerable<(UINib, string)> GetNibsForCellReuse()
        {
            yield return (UINib.FromName(DefaultEmptyCellIdentifier, null), DefaultEmptyCellIdentifier);
        }

        public void RegisterNibs(UITableView tableView)
        {
            foreach (var (xib, key) in GetNibsForCellReuse())
            {
                tableView.RegisterNibForCellReuse(xib, key);
            }
        }

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewCell cell = null;
            cell = (DefaultEmptyCell)tableView.DequeueReusableCell(DefaultEmptyCellIdentifier);
            return cell;
        }

        public override nint RowsInSection(UITableView tableview, nint section)
        {
            return 0;
        }
    }

现在我们有了我们的基类

您可以在每个TableSource中管理空单元格。

public class ListTableViewSource : TableViewSourceBase
    {
        private const string SimpleCellIdentifier = "SimpleCell";

        public ListTableViewSource()
        {
        }

        public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
        {
            UITableViewCell cell = null;

            if (indexPath.Row >= [COUNT])
                return base.GetCell(tableView, indexPath);

            //Load your other cells here according to your need

            return cell;
        }

        protected override IEnumerable<(UINib, string)> GetNibsForCellReuse()
        {
            yield return (UINib.FromName(SimpleCellIdentifier, null), SimpleCellIdentifier);

            foreach (var tuple in base.GetNibsForCellReuse())
            {
                yield return tuple;
            }
        }
    }

就像您不必费心启动Xib一样,处理您的标识符也很简单。