如何在ViewDidAppear期间显示我的RefreshControl

时间:2016-10-20 12:08:56

标签: ios uitableview xamarin.ios uirefreshcontrol

我自己已经回答了这个问题 - 现在就把这个问题留给这里了。

我的代码非常简单 - 一个带有数据源的自定义表,用于从Web服务异步提供数据。

为了获得最好的用户体验,我希望UIRefreshControl能够在出现此控制器时为加载过程设置动画,而不是仅在列表被拉下时。

如果我在UIRefreshControl期间调用我的方法,则ViewDidAppear根本不显示。

我已经尝试过回答这些问题的建议,但它们似乎都不适合我:

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);
    }
}

我目前获得的只是一个看起来空白的屏幕,无需指示即可加载数据,然后在屏幕完成后更新屏幕。

有人可以发现错误吗?我真的找不到一个,因为这段代码很简单。

1 个答案:

答案 0 :(得分:0)

绝望地将其发布在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以使动画激发。

校正

只有当扩展边缘设置为在顶部条形下延伸时,才需要这个额外的偏移。