Please note this is a duplicate of a forum question over at Xamarin Forums.
我有一个UITableView,其源设置为UITableViewSource子类。我目前有多种使用方法,其中有明显的方法; NumberOfSections,GetCells,RowsInSection,RowsSelected等。
今天早上在表格顶部实现了一个刷新视图时,我试图实现scrollViewDidScroll(Scroll())方法,但是当表格视图滚动时它没有被调用。没有异常被抛出,也没有碰到断点 - 但是有一个断言失败,当我滚动表视图时偶尔出现在控制台中(不是每次都这样): 12月18日12:50:02 iMac断言[26037]:断言失败:15B42 13C75:断言+ 12188 [8CF1968D-3466-38B7-B225-3F6F5B64C552]:0x1
表视图源在ViewController中设置如下: journeyTableView.Source = dts = new DashboardTableSource();
在TableViewSource代码中如下: 使用基金会; 使用系统; 使用System.CodeDom.Compiler; 使用UIKit; 使用System.Collections.Generic; 使用CoreGraphics; 使用VideoToolbox;
namespace AppName
{
public class DashboardTableSource : UITableViewSource
{
public const string CellIndentifer = "DriveCell";
#region Refresh View Related
public override void Scrolled (UIScrollView scrollView)
{
// Globals.refreshView.DidScroll ();
Console.WriteLine ("TV Scrolled!");
}
#endregion
public override nint NumberOfSections (UITableView tableView)
{
if(!dataLoaded)
{
var rect = new CGRect (0, 0, tableView.Bounds.Width, tableView.Bounds.Height);
UIImageView iv = new UIImageView(tableView.Bounds);
iv.Image = UIImage.FromBundle ("NoData");
iv.ContentMode = UIViewContentMode.Center;
tableView.BackgroundView = iv;
return 0;
}
else
{
UIView.Animate (0.5, ()=>{
if(tableView.BackgroundView != null){
tableView.BackgroundView.Alpha = 0.0f;
tableView.BackgroundView = null;
}
});
return 1;
}
}
public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell (CellIndentifer) as DashboardTableCell ??
new UITableViewCell (UITableViewCellStyle.Default, CellIndentifer) as DashboardTableCell;
if (cell != null) {
cell.SetupCell (dataLoaded, indexPath);
return cell;
} else {
return null;
}
}
public override nint RowsInSection (UITableView tableview, nint section)
{
if (!dataLoaded)
return 0;
else
return obj.Count;
}
public override bool CanEditRow (UITableView tableView, NSIndexPath indexPath)
{
return true;
}
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
var cell = tableView.CellAt (indexPath) as DashboardTableCell;
cell.SetSelectedState (true, true);
SelectedRow = indexPath.Row;
}
public override void RowDeselected (UITableView tableView, NSIndexPath indexPath)
{
}
}
}
在应用程序中没有其他事件正在侦听表视图滚动,因此我无法真正理解为什么不会触发此事件。任何帮助将不胜感激!
感谢。
答案 0 :(得分:0)
除了一件事,你的代码似乎没问题。问题实际上在于GetCell
方法。
首先,我假设DashboardTableCell
是UITableVIewCell
的子类。如果是这种情况,请在此行中
new UITableViewCell (UITableViewCellStyle.Default, CellIndentifer) as DashboardTableCell
你试图将基类转换为子类,它可以(并且在我的测试中)返回null。
如果强制转换不成功而不是抛出异常<{p>,as
运算符将返回null
来自https://msdn.microsoft.com/en-us/library/cscsdfbt.aspx
as运算符就像一个强制转换操作。但是,如果转换不可能,则返回null而不是引发异常。
然后如果cell为null,则返回null。返回null也导致Assertion失败。
因此,您只需将UITableViewCell
替换为DashboardTableCell
并删除as
,就像这样:new DashboardTableCell (UITableViewCellStyle.Default, CellIndentifer);
但这种方式对我来说看起来更干净:
public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell (CellIndentifer) as DashboardTableCell;
if (cell == null) {
// Notice that we are creating an instance of DashboardTableCell
// instead of UITableViewCell
cell = new DashboardTableCell (UITableViewCellStyle.Default, CellIndentifer);
}
// cell is definitely not null now. You can update and return
cell.SetupCell (dataLoaded, indexPath);
return cell;
}
如果这不能解决您的问题,我会再次查看您的代码:)