UITableViewCell在滚动期间突出显示,然后在以后选择

时间:2015-12-05 16:27:27

标签: ios uitableview xamarin.ios

我有一个带有UITableView的Xamarin.iOS应用程序。视图中只有一个部分。如果我将手指放在桌子的一行(例如,第5行),请按住它片刻,然后滚动表格视图,该行将突出显示。这有点不受欢迎,但没什么大不了的。但是,如果我然后点击另一行(比如第10行)来选择它,我的UITableViewSource对象将获得一个RowSelected回调与原始触摸的行。这是一个大问题,因为应用现在认为用户选择了错误的行。此外,我看不到任何带有正确抽头行的回调。

我试图通过在滚动结束时取消选择行来修复此问题。它没有帮助。

我有一个非Xamarin版本的应用程序,不会出现此行为。

以下是我的一些代码(来自自定义的UITableViewSource子类)和输出:

public int HighlightedRowIndex {get;set;} = -1;

public override void RowHighlighted(UITableView tableView, NSIndexPath rowIndexPath) {
  // I actually don't want to be looking at highlighted at all; I'm just going here to try to understand/fix the problem.
  CommonDebug.LogLine("row highlighted", (int)rowIndexPath.Row);
  this.HighlightedRowIndex = rowIndexPath.Row;
}

public override void DraggingEnded(UIScrollView scrollView, bool willDecelerate) {
  int highlighted = this.HighlightedRowIndex;
  if (highlighted >= 0) {
    NSIndexPath indexPath = NSIndexPath.FromRowSection(0, (nint)highlighted);
    UITableView tableView = scrollView as UITableView;
    if (tableView!=null) {
      CommonDebug.LogLine("ATTEMPTING HACK FIX, BUT IT DOES NOT HELP");
      //  tableView.SelectRow(indexPath, false, UITableViewScrollPosition.None); // This can be commented out, or not; it doesn't help either way.
      tableView.DeselectRow(indexPath, false);
    }
  }
  this.HighlightedRowIndex = -1;
}

public override bool ShouldHighlightRow(UITableView tableView, NSIndexPath rowIndexPath) {
  CommonDebug.LogLine("should highlight", (int)rowIndexPath.Row);
  // Returning false from here would prevent the problem, but would also prevent any selection . . .
  return true;
}

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) {
  CommonDebug.LogLine("IOSListViewSource selected", indexPath.Row);
  if (this.SelectIgnoreCount == 0) {
    ListViewSectionModel model = this.GetModel();
    int row = (int)indexPath.Row;
    model.SelectItem(row);
  } else {
    CommonDebug.LogLine("ignoring");
  }
}

输出:

我把手指放在第5行,让它在那里逗留片刻,然后滚动表格视图:

should highlight 5
row highlighted 5
ATTEMPTING HACK FIX, BUT IT DOES NOT HELP

然后我点击第10行:

WillSelectRow 5
IOSListViewSource selected 5

没有迹象表明我可以发现第10行被点击了。

有没有人遇到同样的问题/找到了解决办法?

2 个答案:

答案 0 :(得分:0)

这解决了它:

public int HighlightedRowIndex {get;set;} = -1;

public override void DraggingEnded(UIScrollView scrollView, bool willDecelerate) {
  int highlighted = this.HighlightedRowIndex;
  if (highlighted >= 0) {
    UITableView tableView = scrollView as UITableView;
    if (tableView!=null) {
      tableView.ReloadData();
    }
  }
  this.HighlightedRowIndex = -1;
}

public override void RowHighlighted(UITableView tableView, NSIndexPath rowIndexPath) {
  this.HighlightedRowIndex = rowIndexPath.Row;
}

答案 1 :(得分:0)

类似的方法是将自定义委托添加到UITableView(List)。我这样做是因为在我的情况下,对UITableViewSource进行子类化是个坏主意。

定义自定义委托并覆盖滚动功能:

Charts("Chart1").SeriesCollection(1).Values = Array(1, 3, 5, 7, 11, 13, 17, 19)

将委托添加到ListRenderer中的UITableView

public class CustDelegate : UITableViewDelegate
 {
    private CustomListViewRenderer list { get; set; }
    public CustDelegate(CustomListViewRenderer listRenderer)
        : base()
    {
        list = listRenderer;
    }
    public override void Scrolled(UIScrollView scrollView)
    {
        if(list != null)
            list.Scrolled();
    }
}

定义滚动功能,以防止突出显示。

希望这对某人有用。