【问题标题】:Image appears only after scroll TableView图片仅在滚动 TableView 后出现
【发布时间】:2019-01-17 11:16:23
【问题描述】:

我有几个文本字段和图像的 TableView。对于图像加载,我使用 SDWebImage 库。

这是 TableView 源代码

public class ExperienceSource : UITableViewSource
{

    //UINavigationController instance, to pass it to constructor
    private UINavigationController primNav { get; set; }
    private UITableView tableView { get; set; }
    List<Experience> TableItems;
    ExperienceTableViewController owner;
    public ExperienceSource(List<Experience> items,ExperienceTableViewController owner, UINavigationController nav)
    {
        TableItems = items;
        this.owner = owner;
        primNav = nav;
    }


    public override nint RowsInSection(UITableView tableview, nint section)
    {

        if (TableItems.Count == 0)
        {


            var noDataLabel = new UILabel
            {
                Text = "No Experiences at your location at this time. Try to change destination",
                TextColor = UIColor.Black,
                TextAlignment = UITextAlignment.Center,
                LineBreakMode = UILineBreakMode.WordWrap,
                Lines = 0
            };
            tableview.BackgroundView = noDataLabel;
            tableview.SeparatorStyle = UITableViewCellSeparatorStyle.None;

            return TableItems.Count;
        }
        else
        {
            tableview.BackgroundView = null;
            tableview.SeparatorStyle = UITableViewCellSeparatorStyle.SingleLine;
            return TableItems.Count;
        }


    }

    public override async void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        var selectedExperience = await ExperienceMethods.GetSelectedTour(TableItems[indexPath.Row].id);
        if (selectedExperience == "Saved")
        {
        ExperienceDetailViewController ExperienceDetailController = primNav.Storyboard.InstantiateViewController("ExperienceDetailViewController") as ExperienceDetailViewController;
        primNav.PushViewController(ExperienceDetailController, true);

        }
        else
        {
          UIAlertController okAlertController = UIAlertController.Create("", "Cannot select this experience", UIAlertControllerStyle.Alert);
        okAlertController.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null));
        }
        tableView.DeselectRow(indexPath, true);
    }


    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var cell = tableView.DequeueReusableCell("cell_id", indexPath) as ExperienceCell;
        Experience item = TableItems[indexPath.Row];
        cell.UpdateCell(item);
        return cell;
    }
}

这是 CustomCell 的代码

public partial class ExperienceCell : UITableViewCell
{
    UIImage picture;
    public ExperienceCell (IntPtr handle) : base (handle)
    {
    }
    internal void UpdateCell(Experience experience)
    {
            var image_url = "https://xplorpal.com/" + experience.cover_image.img_path + "/150x150/" + experience.cover_image.img_file;
            /*using (var url = new NSUrl(image_url))
            using (var data = NSData.FromUrl(url))
            picture = UIImage.LoadFromData(data);
            ExperienceImage.Image = picture;*/
            ExperienceImage.SetImage(NSUrl.FromString(image_url),
                                       UIImage.FromBundle("placeholder"),
                                       SDWebImageOptions.RefreshCached);
            ExperienceTitle.Text = experience.title;
            ExperiencePrice.Text = "$" + experience.price;
    }
    }

我的问题是,图像仅在滚动后出现在 UIImage 中,或者转到另一个 ViewController 之后,返回。

如果我使用注释代码 vs NSUrl 等。没关系。

我的问题可能出在哪里?为什么我使用 SDWebImage 时不显示图像?

谢谢你的帮助。

【问题讨论】:

  • 首先是检查线程。使用assert(Thread.isMainThread)
  • 我需要在哪里使用它? @CZ54
  • UpdateCell func 的第一行?
  • 也许你的意思是 if (NSThread.Current.IsMainThread) {cell.UpdateCell(item);} 在 GetCell 方法中? @CZ54
  • 喜欢使用主线程@CZ54

标签: c# ios xamarin xamarin.ios sdwebimage


【解决方案1】:

具有大量行的表格视图在给定时间仅显示其总项目的一小部分。对于表格视图来说,仅询问正在显示的行的单元格是有效的 因此,在滚动表格视图时,单元格会被重新使用,并且单元格内的数据会被重新填充。

由于您使用的是下载的图像,因此速度似乎很慢。

您可以尝试加载与单元格内的图像视图完全相同大小的图像。

Apple developer site

Optimizing table view performance

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多