Xamarin iOS RefreshControl зависает

У меня проблема с 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 находятся здесь:

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, то отображается загрузка Refresh, но она застревает без эффекта загрузки и по-прежнему с текстом «Потяните, чтобы обновить». Когда метод Refresh завершается так, что в течение 0,1 мс отображается эффект загрузки и текст «Обновление», но не перед методом Refresh ... Кто-нибудь знает, как решить эту проблему? Спасибо за ответ.


person pnk    schedule 22.03.2017    source источник


Ответы (1)


Похоже, проблема связана с синхронным методом Refresh();. Вам нужно будет выполнить эту операцию в фоновом режиме, чтобы поток пользовательского интерфейса мог предоставить анимацию для 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().

Есть много ресурсов для начала работы с задачами, async и await. Я могу начать с этой ссылки из блога Xamarin.

person therealjohn    schedule 22.03.2017
comment
все то же самое: / это странно .. но когда я помещаю вместо кода метода Refresh () с таймером, он работает .... var timer = NSTimer.CreateRepeatingScheduledTimer (TimeSpan.FromSeconds (5.0), делегирую {ordersCollectionView.RefreshControl.EndRefreshing ( );}); - person pnk; 22.03.2017
comment
Обновите свой пост тем, что вы пробовали. Похоже, что метод Refresh все еще синхронный. Таймера бы не было, наверное поэтому он работает иначе. - person therealjohn; 22.03.2017