如何让我的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); 
    } 
} 

所有我目前得到的是一个看起来空的屏幕,加载数据没有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来使动画成为火焰。

修正

这种额外的偏移,似乎如果延伸的边缘设置在顶部条延伸到仅需要。