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 参考开始。
我有 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 参考开始。