如何让我的RefreshControl在ViewDidAppear期间出现
问题描述:
我自己回答了这个问题 - 现在就把它留在这里,面向有同样问题的人。
我的代码非常简单 - 一个自定义表,其中包含一个数据源以便从Web服务异步提供数据。如何让我的RefreshControl在ViewDidAppear期间出现
为了获得最好的用户体验,我希望UIRefreshControl
可以在每当此控制器出现时加载动画,而不是仅在列表被拉下时进行加载。
不幸的是,如果我在ViewDidAppear
期间拨打我的方法,则不会出现UIRefreshControl
。
我试图从答案建议这些问题,但没有人似乎为我工作:
public partial class ControlCenterSelectionController : UITableViewController
{
public ControlCenterSelectionController (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
TableView.RefreshControl = new UIRefreshControl();
TableView.RefreshControl.ValueChanged += RefreshControlOnValueChanged;
}
private async void RefreshControlOnValueChanged(object sender, EventArgs eventArgs)
{
await UpdateDataSourceAsync();
}
public override async void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
TableView.SetContentOffset(new CGPoint(0, -TableView.RefreshControl.Frame.Size.Height), true);
await UpdateDataSourceAsync();
}
private async Task UpdateDataSourceAsync()
{
TableView.RefreshControl.BeginRefreshing();
var ccClient = DI.Instance.Get<IControlCenterRestClient>();
var controlCenters = await ccClient.GetAllAsync();
var source = new GenericViewSource<ControlCenter>(controlCenters, item => item.Name, ControlCenterSelected);
TableView.Source = source;
TableView.RefreshControl.EndRefreshing();
}
private void ControlCenterSelected(ControlCenter controlCenter)
{
var controller = this.InstantiateController(Constants.ViewControllerIds.ControlCenter) as ControlCenterController;
controller.ControlCenter = controlCenter;
this.NavigateTo(controller);
}
}
- UITableView UIRefreshControl Does Not Show Its View The First Time
- UIRefreshControl on viewDidLoad
- UIRefreshControl - beginRefreshing not working when UITableViewController is inside UINavigationController
所有我目前得到的是一个看起来空的屏幕,加载数据没有ind然后在完成后更新屏幕。
有人可以发现一个错误?我找不到一个,因为这个代码很简单。
答
张贴在SO +绝望编码尝试的绝望是关键:
public override async void ViewDidAppear(bool animated)
{
base.ViewDidAppear(animated);
TableView.SetContentOffset(new CGPoint(0, -(TableView.RefreshControl.Frame.Size.Height + 20)), true);
TableView.RefreshControl.BeginRefreshing();
await UpdateDataSourceAsync();
}
private async Task UpdateDataSourceAsync()
{
var ccClient = DI.Instance.Get<IControlCenterRestClient>();
var controlCenters = await ccClient.GetAllAsync();
var source = new GenericViewSource<ControlCenter>(controlCenters, item => item.Name, ControlCenterSelected);
TableView.Source = source;
TableView.RefreshControl.EndRefreshing();
}
这种变化特别制作的区别:
-(TableView.RefreshControl.Frame.Size.Height + 20)
事实证明,而在其他问题通过简单地应用基于RefreshControl的滚动来解决问题会触发动画,在我的情况下,我不得不添加一些额外的y delta来使动画成为火焰。
修正
这种额外的偏移,似乎如果延伸的边缘设置在顶部条延伸到仅需要。