【问题标题】:Image not loading until you scroll table View在滚动表格视图之前不会加载图像
【发布时间】:2019-01-25 17:33:52
【问题描述】:

我有 Xamarin.iOS 项目,我在哪里使用 TableView

这里是tableView源码

 public class ExperienceSourceNew: UITableViewSource
{
    private UINavigationController primNav { get; set; }
    private UITableView tableView { get; set; }
    List<Experience> TableItems;
    ExperienceViewControllerNew _owner;
    static NSString cellIdentifier = new NSString("newcell_id");
    public ExperienceSourceNew(List<Experience> items, ExperienceViewControllerNew owner, UINavigationController nav)
    {
        TableItems = items;
        _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 = (ExperienceCellNew)tableView.DequeueReusableCell(cellIdentifier, indexPath);
        Experience item = TableItems[indexPath.Row];
        cell.UpdateCell(item);
        return cell;
    }

我为 TableView 使用自定义 Cell,所以这里是它的代码

public ExperienceCellNew (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;
        ExperienceTitleNew.Text = experience.title;
        ExperiencePriceNew.Text = "$" + experience.price;
        NSUrlSession session = NSUrlSession.SharedSession;
        var dataTask = session.CreateDataTask(new NSUrlRequest(new NSUrl(image_url)), (data, response, error) =>
        {
            if (response != null)
            {
                DispatchQueue.MainQueue.DispatchAsync(() =>
                {
                    ExperienceImageNew.Image = UIImage.LoadFromData(data);
                });
            }
        });

        dataTask.Resume();
    }
}

我的问题,图像没有出现在视图加载中,我在标签中有文本,但没有图像。如果我滚动 TableView,图像会出现在单元格中。

问题可能在哪里以及如何解决?

【问题讨论】:

    标签: c# ios .net xamarin xamarin.ios


    【解决方案1】:

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

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

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

    This is similar to your issue

    并且还将图像分配给主线程上的 imageview 并使其同步,因为 UI 更改需要同步访问主线程。

    【讨论】:

    • 你的意思 - 确切的尺寸?
    • 如果图像视图是 50x50 像素,那么加载 1024x1024 将是不必要的,并且需要更多时间来加载和显示,因此选择最接近图像视图大小的大小会加快进程。跨度>
    • 已经是最小尺寸了。我的问题是加载图像。它仅在滚动后出现。它如何与图像大小相关联?我尝试了不同大小的图像,所以我认为它与此无关。当我不在 tableview 中使用此代码时,在 uiimage 的简单视图中,所有下载都很好,并且图像出现时没有滚动,或者 smth。
    • tableview 不会一次加载所有单元格的所有图像。创建单元格时会下载图像。由于单元格是动态的,因此它们只创建填满屏幕所需的数量。例如,如果四个单元格填满屏幕,则在开始时只会创建四到五个单元格。只有当您开始滚动时,才会创建其他单元格,也就是下载图像时。由于在您滚动后开始下载,因此图像需要一些时间来加载。您可以尝试添加本地默认图像,直到实际图像被下载
    • 好的。当屏幕上只有一个单元格时,我会看到同样的问题。
    【解决方案2】:

    作为替代方案,您可以使用FFImageLoading,它可以让您这样做

    ImageService.LoadUrl(image_url).Into(ExperienceImageNew);
    

    【讨论】:

    • 我正在尝试使用它,同样的事情。图像直到滚动才会出现。我的问题,我不明白,为什么
    猜你喜欢
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多