2014-02-18 2 views
0

В настоящее время я разрабатываю приложение iOS с использованием рамки Monotouch (Xamarin).iOS - UITableView - Строки загадочно повторяются при прокрутке быстро? (simulator)

У меня есть собственный источник таблицы, в котором используются пользовательские ячейки, высота которых вычисляется динамически.

Когда я запускаю проект в симуляторе iOS, если я быстро прокручиваю его в нижнюю или верхнюю часть, верхняя ячейка заменяет нижнюю или наоборот - как если бы она неправильно рисовала или повторно использовала неправильную ячейку по ошибке?

Просто чтобы прояснить - если мои клетки

один два три четыре пять

Если я быстро прокручиваются сверху вниз, мои клетки появляются как

один два три один

Или, если я медленно прокрутите вниз, и клетку остаться в порядке, когда я быстро перейти к вершине я получить

пяти два три четыре пять

И если я прокрутку вверх и вниз спорадически, клетки могут беспорядочно перемешиваться.

Моего источник таблица выглядит следующим образом:

PostModel[] models; 
    string cellIdentifier = "FeedCell"; 
    public FeedSource (PostModel[] items) 
    { 
     models = items; 
    } 
    public override int RowsInSection (UITableView tableview, int section) 
    { 
     return models.Length; 
    } 

    public override float GetHeightForRow (UITableView tableView, NSIndexPath indexPath) 
    { 
     FeedCell cell = this.GetCell (tableView, indexPath) as FeedCell; 

     var height = cell.height; 
     return height; 
    } 

    public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) 
    { 
     FeedCell cell = tableView.DequeueReusableCell (cellIdentifier) as FeedCell; 
     //if there are no cells to reuse, create a new one 
     if (cell == null) { 
      cell = new FeedCell (models [indexPath.Row], new NSString (cellIdentifier)); 
      cell.LayoutSubviews(); 
     } 
     //cell.height = cell.height; 

     return cell; 
    } 

Я слышал о проблемах с производительностью с динамическими высотами ячеек, но я только тестирование с 5 клетками, и это только кажется странным.

Может ли это быть моим симулятором iOS, и этого не произойдет на устройстве? Это можно как-то исправить?

ответ

4

Клетки повторно используются, когда это возможно. Логика дает мне любую доступную ячейку (DequeueReusableCell), если ячейка недоступна (cell == null), затем создайте новую ячейку (new FeedCell).

Из-за этого вы не должны связывать содержимое ячейки при ее создании. Вам просто нужно создать новую пустую ячейку.

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

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath) 
{ 
    FeedCell cell = tableView.DequeueReusableCell (cellIdentifier) as FeedCell; 
    //if there are no cells to reuse, create a new one 
    if (cell == null) { 
     cell = new FeedCell (new NSString (cellIdentifier)); 
    } 

    cell.model = models[indexPath.row]; // assuming you can do something like this. 
    cell.layoutSubviews(); 

    return cell; 
} 
+0

Спасибо. Вместо того, чтобы инициализировать мою ячейку в качестве повторно используемой ячейки, я просто инициализировал ее нормально и вернул ее, и это решило проблему ... но почему повторяется контент, а не только размер? Невозможно повторно использовать ячейки с полностью динамическими высотами? –

+0

@JasonMcGraw Я сделал это в Objective-C. Я могу только предположить, что это возможно в C#. Ячейка должна быть построена для изменения размера. –

+0

@JasonMcGraw 'GetHeightForRow' необходимо определить высоту ячейки независимо от' GetCell'. Ячейка, возвращаемая 'GetCell', должна соответствовать высоте, возвращаемой' GetHeightForRow'. –

Смежные вопросы