首页 > 解决方案 > Xamarin.Forms ScrollView ScrollToAsync() 在 iOS 上导致空白内容

问题描述

背景 我们有一个页面,我们在 ScrollView 中有一个绑定的 RepeaterView。当用户回答问题时,我们将问题添加到绑定集合中(目的是给出一系列问题,随着用户的进展从顶部滚动)。

我们希望 ScrollView 在添加问题时滚动到底部。

为此,我创建了一个在添加问题时引发的事件,并在页面中添加了一个处理程序。我正在订阅/取消订阅页面的 Appearing/Disappearing 事件以避免内存泄漏等。

Android上的问题这工作正常。但在 iOS 上,ScrollView 变为空白。但是,如果我将应用程序置于后台并将其带回前台(通过点击主页按钮,然后点击应用程序图标,屏幕就会刷新。

因此,我的代码似乎没有正确刷新页面。

我的 XAML 代码:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MvvmCross.Forms.Presenters.Attributes;
using MyApp.Mobile.PageModels.Claims.Medical;
using MyApp.Mobile.Pages.Base;
using Xamarin.Forms;

namespace MyApp.Mobile.Pages.Claims.Medical
{
    [MvxContentPagePresentation(NoHistory = true)]
    public partial class ClaimConditionPage : BaseContentPage<ClaimConditionPageModel>
    {
        public ClaimConditionPage()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            if (BindingContext != null)
            {
                ClaimConditionPageModel model = (ClaimConditionPageModel)this.BindingContext.DataContext;

                model.QuestionAdded += Model_QuestionAdded;
            }

            base.OnAppearing();
        }

        protected override void OnDisappearing()
        {
            ClaimConditionPageModel model = (ClaimConditionPageModel)this.BindingContext.DataContext;

            model.QuestionAdded -= Model_QuestionAdded;
            base.OnDisappearing();
        }

        void Model_QuestionAdded(object sender, EventArgs e)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await QuestionScrollView.ScrollToAsync(0, QuestionScrollView.Content.Height, false);
            });

        }

    }
}

我已经看到添加 Task.Delay() 以允许 UI 赶上的建议 - 但这不起作用。

请注意,这仅适用于 iOS。

我注意到有这个错误,但我不认为这是我的问题。ScrollView 确实滚动,但显示变为空白。

版本 Xamarin.Forms 3.4.0.1029999

=== 适用于 Mac 的 Visual Studio 社区 2017 ===

版本 7.8.2 (build 1) 安装 UUID: 650b4c91-c7f5-4ee5-ad70-6f178f314906 GTK+ 2.24.23 (Raleigh 主题) Xamarin.Mac 5.0.0.0 (/b40230c0)

Package version: 516000221

=== Mono 框架 MDK ===

运行时:Mono 5.16.0.221 (2018-06/b63e5378e38)(64 位) 包版本:516000221

=== NuGet ===

版本:4.8.0.5385

=== .NET 核心 ===

运行时:/usr/local/share/dotnet/dotnet 运行时版本:2.1.8 2.1.5 2.1.2 2.1.1 2.0.5 SDK:/usr/local/share/dotnet/sdk/2.1.504/Sdks SDK 版本:2.1.504 2.1.403 2.1.302 2.1.301 2.1.4 MSBuild SDK:/Library/Frameworks/Mono.framework/Versions/5.16.0/lib/mono/msbuild/15.0/bin/Sdks

=== Xamarin.Profiler ===

版本:1.6.4 位置:/Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== 更新程序 ===

版本:11

=== 苹果开发者工具 ===

Xcode 10.1 (14460.46) 构建 10B61

=== Xamarin.Mac ===

版本:5.2.1.15(Visual Studio 社区)哈希:d60abd198 分支:构建日期:2019-02-01 12:23:30-0500

=== Xamarin.iOS ===

版本:12.2.1.15(Visual Studio 社区)哈希:d60abd198 分支:d15-9 构建日期:2019-02-01 12:23:29-0500

=== Xamarin.Android ===

版本:9.1.8.0(Visual Studio 社区) Android SDK:/Users/jameslavery/Library/Developer/Xamarin/android-sdk-macosx 支持的 Android 版本:2.3(API 级别 10)4.0.3(API 级别 15)4.1(API 16 级) 4.3(API 18 级) 4.4(API 19 级) 5.0(API 21 级) 5.1(API 22 级) 6.0(API 23 级) 7.0(API 24 级) 7.1(API 25 级) 8.0(API 26 级) ) 8.1 (API 级别 27)

SDK 工具版本:26.1.1 SDK 平台工具版本:28.0.0 SDK 构建工具版本:26.0.2

=== 微软移动 OpenJDK ===

Java SDK:/Users/jameslavery/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_8.0.25 1.8.0-25 Android Designer EPL 代码可在此处获得: https ://github.com/xamarin/AndroidDesigner.EPL

=== Android 设备管理器 ===

版本:7.8.1.0 哈希:8924ea4a

=== Xamarin 检查员 ===

版本:1.4.3 哈希:db27525 分支:1.4-release 构建日期:星期一,2018 年 7 月 9 日 21:20:18 GMT 客户端兼容性:1

=== 构建信息 ===

发布 ID:708020001 Git 修订:13e0e5b7e85ffe742957e6f204bab5c06c644f0e 构建日期:2019-02-27 19:33:14+00 构建分支:release-7.8 Xamarin 扩展:23eaa7c9cdc9a3f55be7bb87b485a790ec82ef2

=== 操作系统 ===

Mac OS X 10.13.6 Darwin 17.7.0 Darwin Kernel Version 17.7.0 Fri Nov 2 20:43:16 PDT 2018 root:xnu-4570.71.17~1/RELEASE_X86_64 x86_64

=== 启用用户安装的扩展 ===

LiveXAML 1.3.31 MFractor 3.7.10 MvvmCross Template pack 2.0.1 NuGet Package Management Extensions 0.15 Template Creator 0.4 Redth's Addins 1.0.9 物联网 (IoT) 开发(预览版)7.5

标签: xamarin.forms

解决方案


iOS 上似乎存在带有此ScrollToAsync签名的错误。

更改为ScrollToAsyncwhich 需要一个元素来修复它。

有趣的是,我需要一个Task.Delay(10)允许在调用 ScrollToAsync 之前更新中继器的大小。结果代码是:

    void Model_QuestionAdded(object sender, EventArgs e)
    {
        Device.BeginInvokeOnMainThread(async () =>
        {
            await Task.Delay(10);
            await QuestionScrollView.ScrollToAsync(QuestionRepeater, ScrollToPosition.End, true);
        });

    }

如果可能的话,最好避免这种Task.Delay()情况——我不喜欢这种事情,因为设备上的时间不同,而且我可能会发现在较慢/较快的设备上延迟不够长。


推荐阅读