我有一个带有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行被点击了。
有没有人遇到同样的问题/找到了解决办法?
答案 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();
}
}
定义滚动功能,以防止突出显示。
希望这对某人有用。