Xamarin iOS RefreshControl卡住了

时间:2017-03-22 12:51:36

标签: xamarin xamarin.ios uirefreshcontrol

我有一个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方法和Refresh merhod在这里:

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所以刷新加载显示但没有加载效果但仍然带有文本"拉动刷新"。方法刷新结束所以0,1ms显示加载效果和文本"刷新"方法刷新之前没有...有人知道如何解决这个问题?谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

看起来这个问题与同步的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和Tasks。您可能需要重构一些代码才能使其工作,包括OnReloadData()方法。

有很多资源可以开始使用Tasks,async和await。我可以从Xamarin博客的this引用开始。

相关问题