Xamarin iOS RefreshControl 卡住了

Xamarin iOS RefreshControl is stuck

我有 RefreshControl 的问题...我有这个代码:

ViewDidLoad() 我调用方法 InitializeRefreshControl();

private void InitializeRefreshControl()
    {
        if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0))
        {
            //UIRefreshControl iOS6
            ordersCollectionView.RefreshControl = new UIRefreshControl();
            ordersCollectionView.RefreshControl.AttributedTitle = new NSAttributedString("Pull To Refresh",
            new UIStringAttributes()
            {
                ForegroundColor = UIColor.Red,
                KerningAdjustment = 3
             });
            ordersCollectionView.RefreshControl.ValueChanged += HandleValueChanged;
        }
        else
        {
            // old style refresh button and no PassKit for older iOS
            NavigationItem.SetRightBarButtonItem(new UIBarButtonItem(UIBarButtonSystemItem.Refresh), false);
            NavigationItem.RightBarButtonItem.Clicked += (sender, e) => { Refresh(); };
        }
    }

HandleValueChange 方法和刷新方法在这里:

private void HandleValueChanged(object sender, EventArgs e)
    {
        ordersCollectionView.RefreshControl.BeginRefreshing();
        ordersCollectionView.RefreshControl.AttributedTitle = new NSAttributedString("Refreshing",
            new UIStringAttributes()
            {
                ForegroundColor = UIColor.Blue,
                KerningAdjustment = 5
            });

        Refresh();
        ordersCollectionView.RefreshControl.EndRefreshing();
    }

    private void Refresh()
    {
        var viewModel = (OrdersViewModel)DataContext;
        viewModel.OnReloadData();
    }

我的问题是当我下拉 collectionVIew 时显示刷新加载但没有加载效果并且仍然带有文本 "Pull to refresh"。当方法刷新结束时 0,1ms 显示加载效果和文本 "Refreshing" 但不是在方法刷新之前...有人知道如何解决这个问题吗?谢谢回答。

看起来问题与 Refresh(); 方法同步有关。您需要使此操作在后台发生,以便 UI 线程可以自由地为 RefreshControl 提供动画。例如:

private async void HandleValueChanged(object sender, EventArgs e)
{
    ordersCollectionView.RefreshControl.BeginRefreshing();
    ordersCollectionView.RefreshControl.AttributedTitle = new NSAttributedString("Refreshing",
        new UIStringAttributes()
        {
            ForegroundColor = UIColor.Blue,
            KerningAdjustment = 5
        });

    // await a Task so that operation is done in the background
    await Refresh();
    ordersCollectionView.RefreshControl.EndRefreshing();
}

// Marked async and Task returning
private async Task Refresh()
{
    var viewModel = (OrdersViewModel)DataContext;
    // Need to update this method to be a Task returning, async method.
    await viewModel.OnReloadData();
}

以上代码重构了您必须使用的 async/await 和任务。您可能需要重构更多代码才能使其正常工作,包括 OnReloadData() 方法。

有很多资源可用于开始使用 Tasks、async 和 await。我可以从 Xamarin 博客中的 this 参考开始。