*** -[Scrapboom.iPhone.NewsFeedTableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/U

Posted

技术标签:

【中文标题】*** -[Scrapboom.iPhone.NewsFeedTableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/UIKit-2903.2/UITableView.m:1076【英文标题】:*** Assertion failure in -[Scrapboom.iPhone.NewsFeedTableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2903.2/UITableView.m:1076 【发布时间】:2013-10-17 05:34:19 【问题描述】:

我在 UITablViewSource 中使用下面的代码

 public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
 
 UIImage scaledImage=null;
string cellIdentifier = "NewsFeedCell"; 
var newsFeedCellItem = NewsFeedCellItemList [indexPath.Row];    
var newsFeedCell = new NewsFeedCell (NewsFeedScreenInstance, newsFeedCellItem,       cellIdentifier, indexPath);

if (newsFeedCell != null) 
 if (!String.IsNullOrWhiteSpace (newsFeedCellItem.FeedItem.Picture.PreviewUrl)) 
                var image = ImageStore.Get      (newsFeedCellItem.FeedItem.Picture.PreviewUrl);
                if(image != null)
                
                    newsFeedCellItem.FeedItem.Picture.Image = image;
                    scaledImage = ImageHelper.Scale(image, new SizeF (528, 528));
                
                if (scaledImage != null) 
                    newsFeedCell.ScrapImage = scaledImage;
                 else 
                    BeginDownloadImage (tableView, indexPath);
                

            


        

        return newsFeedCell;
    

    #endregion

    #region PRIVATE METHODS

    private void BeginDownloadImage (UITableView tableView, NSIndexPath indexPath)
    
        Action successAction = () => 

            this.BeginInvokeOnMainThread (() => 
                tableView.BeginUpdates ();
                tableView.ReloadRows (new NSIndexPath[]  indexPath , UITableViewRowAnimation.Fade);
                tableView.EndUpdates ();
            );
        ;

        ImageStore.BeginDownloadImage(NewsFeedCellItemList [indexPath.Row].FeedItem.Picture.PreviewUrl, successAction);
    
    #endregion

*描述:*但是下面的部分代码给出了异常

* -[Scrapboom.iPhone.NewsFeedTableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/UIKit-2903.2/UITableView.m:1076 和应用程序是 被绞死或有时崩溃。

tableView.ReloadRows (new NSIndexPath[]  indexPath , UITableViewRowAnimation.Fade);

【问题讨论】:

【参考方案1】:

您的 GetCell 实现看起来有问题。您应该尝试Dequeue 一个单元格,然后在它失败时创建一个单元格(在 ios6+ 中甚至不需要Register*ForCellReuse

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)

    string cellIdentifier = "NewsFeedCell"; 
    var newsFeedCell = tableView.DequeueReusableCell (cellIdentifier) as NewsFeedCell;

    //only required if you haven't used Register*ForCellReuse
    if (newsFeedCell == null)
        newsFeedCell = new NewsFeedCell (..., cellIdentifier,...);

    //update your cell image and components here.

要了解更多信息,请阅读tutorials。

如果您环顾四周,您还会发现经过验证的工作模式可以在表格单元格中延迟加载图像。并不是说你的第一眼看起来不对,但它并不常见。

【讨论】:

NewsFeedCell newsFeedCell= tableView.CellAt (indexPath) as NewsFeedCell;上面的代码返回 newsFeedCell=null 这是可能的,如果它不再显示的话。也就是说,细胞已经被回收了。在这种情况下,您甚至不必费心显示图像。

以上是关于*** -[Scrapboom.iPhone.NewsFeedTableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/U的主要内容,如果未能解决你的问题,请参考以下文章