在GetCell方法中删除动态单元格

时间:2013-10-04 22:54:34

标签: ios objective-c uitableview xamarin.ios custom-cell

如果单元格的图像是坏图像,我正在尝试从UITableView中删除单元格。基本上我的代码对每个单元格的图像执行一个threadPool调用,以便在用户在GetCell方法内滚动时顺利地绑定数据:

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
 //other stuff
    ThreadPool.QueueUserWorkItem(new WaitCallback(RetrieveImage),(object)cell);
}
在该异步方法中,我调用cell.imageUrl属性并将其绑定到NSData对象,如下所示:

NSData data = NSData.FromUrl(nsUrl); //nsUrl is cell.imageUrl

从那里我知道如果 data == null 那么检索图像时出现问题,所以我想将其删除。我目前所做的是将hidden属性设置为true,但这会留下空白。我想删除整个单元格,以便用户甚至不知道它存在。 我无法将单元格高度设置为0,因为在indexrowpath启动getcell调用之前,我不知道imageUrl是否错误。我不想只是检查绑定到UITableView的数据中的所有图像,因为这可能是一个很大的性能,因为它可以很容易地成百上千个项目。我目前正在从Web服务中获取项目,这些项目为我提供了前200项。 如果数据== null 示例

,如何删除单元格altogther
NSUrl nsUrl = new NSUrl(cell.imageUrl);
NSData data = NSData.FromUrl(nsUrl);
if (data != null) {
     InvokeOnMainThread (() => {
    cell.imgImage = new UIImage (data);
    //cell.imgImage.SizeToFit();
});
 } else {
   //I tried the below line but it does't work, I have a cell.index property that I set in the getCell method
   _data.RemoveAt(cell.Index);//_data is the list of items that are binded to the uitableview
    InvokeOnMainThread (() => {
    //cell.Hidden = true;
   });
}

1 个答案:

答案 0 :(得分:1)

您通过从源中删除单元格来删除单元格,然后通过调用UITableViewReloadData().知道源已更改。这将触发刷新过程。 UITableView会询问您的来源有多少行,并且因为您从数据中删除了一行,代表该行的单元格将会消失。 但是ReloadData()会重新加载整个表格。有一种方法可以让你专门删除名为DeleteRows().的单元格。你可以在Xamarin找到一个例子。

删除行时,首先更新模型,然后更新UI非常重要。

或者,我建议您查看MonoTouch.Dialog,它允许以更直接的方式与UITableView进行交互。它还包括对延迟加载图像的支持。