Xamarin iOS UITableView вызывает методы делегата для всех ячеек при начальной настройке, а не только для видимых - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть UITableView с пользовательскими ячейками.Этот TableView находится в контроллере представления и занимает все размеры представления.RowHeight каждой ячейки устанавливается на высоту TableView, поэтому каждая ячейка занимает полный экран (за исключением панели навигации).Вот скриншот того, как выглядит эта установка.Red - моя обычная клетка;пролистывание вниз приведет к следующей странице, которая имеет другой цвет:

UITableView Cell

Когда TableView впервые становится видимым на экране, я передаю модель (набор цветов) до Setup метода, который затем устанавливает Delegates.Во время этой начальной настройки метод GetCell делегата UITableViewDataSource вызывается для каждой ячейки, несмотря на то, что одновременно видна только одна ячейка.Затем это вызывает методы делегата WillDisplay и CellDisplayingEnded класса UITableViewDelegate.

У меня сложилось впечатление, что UITableView будет создавать экземпляр каждой ячейки только по мере необходимости (когда станет видимым), но создается впечатление, что он создает экземпляр для каждой загружаемой ячейки, независимо от видимости.

Я создал уменьшенный образец для совместного использования, в котором всего 6 записей для таблицы.Затем я добавил журнал в начало каждого из вышеупомянутых методов делегата. Вот вывод при настройке TableView:

[0:] GetCell called. Row 0
[0:] WillDisplayCell called. Row 0, RowHeight 672
[0:] GetCell called. Row 1
[0:] WillDisplayCell called. Row 1, RowHeight 672
[0:] GetCell called. Row 2
[0:] WillDisplayCell called. Row 2, RowHeight 672
[0:] GetCell called. Row 3
[0:] WillDisplayCell called. Row 3, RowHeight 672
[0:] GetCell called. Row 4
[0:] WillDisplayCell called. Row 4, RowHeight 672
[0:] GetCell called. Row 5
[0:] WillDisplayCell called. Row 5, RowHeight 672
[0:] CellDisplayingEnded called. Row 1, RowHeight: 672
[0:] CellDisplayingEnded called. Row 2, RowHeight: 672
[0:] CellDisplayingEnded called. Row 3, RowHeight: 672
[0:] CellDisplayingEnded called. Row 4, RowHeight: 672
[0:] CellDisplayingEnded called. Row 5, RowHeight: 672

Как упоминалось ранее, на экране одновременно видна только одна ячейка.Почему изначально создаются все 6 ячеек?

Пример кода

public class SampleCell : UITableViewCell {
    public void Setup(UIColor color) {
        BackgroundColor = color;
    }
}

public class SampleTableViewDataSourceDelegate : UITableViewDataSource {
    public SampleTableViewDataSourceDelegate(UIColor[] model) {
        this.model = model;
    }

    private readonly UIColor[] model;

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) {
        Debug.WriteLine($"GetCell called. Row {indexPath.Row}");
        var reuseIdentifier = "SampleCell";

        var cell = tableView.DequeueReusableCell(reuseIdentifier) as SampleCell;

        cell = (cell ?? (cell = new SampleCell()));

        cell.Setup(model[indexPath.Row]);

        return cell;
    }

    public override nint NumberOfSections(UITableView tableView) {
        return 1;
    }

    public override nint RowsInSection(UITableView tableView, nint section) {
        return model.Length;
    }
}

public class SampleTableViewDelegate : UITableViewDelegate {
    public SampleTableViewDelegate(UIColor[] model) {
        this.model = model;
    }

    private readonly UIColor[] model;

    public override void WillDisplay(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath) {
        Debug.WriteLine($"WillDisplayCell called. Row {indexPath.Row}, RowHeight {tableView.RowHeight}");
    }

    public override void CellDisplayingEnded(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath) {
        Debug.WriteLine($"CellDisplayingEnded called. Row {indexPath.Row}, RowHeight: {tableView.RowHeight}");
    }
}

public partial class SampleTableView : TableViewBase {
    public SampleTableView(IntPtr handle) : base(handle) {
        PagingEnabled = true;
    }

    private UIColor[] model;

    public void Setup(UIColor[] model) {
        this.model = model;

        Delegate = new SampleTableViewDelegate(model);
        DataSource = new SampleTableViewDataSourceDelegate(model);
    }
}

Затем в моем ViewController я передаю модель следующим образом:

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

    var model = new UIColor[] {
        UIColor.Green,
        UIColor.Red,
        UIColor.Magenta,
        UIColor.Cyan,
        UIColor.Blue,
        UIColor.Purple
    };

    SampleTableView.RowHeight = SampleTableView.Frame.Height;
    SampleTableView.Setup(model);
}

1 Ответ

0 голосов
/ 22 февраля 2019

О, боже, EstimatedRowHeight тоже нужно было установить.

SampleTableView.EstimatedRowHeight = SampleTableView.Frame.Height;

Это решило мою проблему.Теперь GetCell вызывается только один раз при загрузке, поскольку в каждый момент времени отображается только одна видимая ячейка.

Документы (яблоко, но то же самое относится и к ксамарину): https://developer.apple.com/documentation/uikit/uitableview/1614925-estimatedrowheight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...