我的代码非常简单 - 一个带有数据源的自定义表,用于从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);
}
}
我目前获得的只是一个看起来空白的屏幕,无需指示即可加载数据,然后在屏幕完成后更新屏幕。
有人可以发现错误吗?我真的找不到一个,因为这段代码很简单。
答案 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以使动画激发。
只有当扩展边缘设置为在顶部条形下延伸时,才需要这个额外的偏移。