Xamarin.Forms ScrollView ScrollToAsync()在iOS上显示空白内容

时间:2019-03-28 16:30:42

标签: xamarin.forms

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

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

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

问题 在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上。

我注意到这里有this bug,但是我不认为这是我的问题。 ScrollView确实滚动,但是显示为空白。

版本 Xamarin.Forms 3.4.0.1029999

===适用于Mac的Visual Studio Community 2017 ===

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

Package version: 516000221

=== Mono Framework MDK ===

运行时:     单声道5.16.0.221(2018-06 / b63e5378e38)(64位)     套件版本:516000221

=== NuGet ===

版本:4.8.0.5385

=== .NET Core ===

运行时:/ 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

=== Apple开发人员工具===

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 Build Tools版本:26.0.2

=== Microsoft Mobile 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版本 建立日期:2018年7月9日星期一21:20:18 GMT 客户端兼容性:1

===构建信息===

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

===操作系统===

Mac OS X 10.13.6 Darwin 17.7.0 Darwin内核版本17.7.0     2018年11月2日星期五20:43:16 PDT     根目录:xnu-4570.71.17〜1 / RELEASE_X86_64 x86_64

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

LiveXAML 1.3.31 MFractor 3.7.10 MvvmCross模板包2.0.1 NuGet软件包管理扩展0.15 模板创建者0.4 Redth的插件1.0.9 物联网(IoT)开发(预览版)7.5

1 个答案:

答案 0 :(得分:0)

iOS上有一个带有此ScrollToAsync签名的错误。

更改为采用元素的ScrollToAsync即可解决。

有趣的是,我需要一个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()-我不喜欢这种事情,因为设备上的时间有所不同,而且我可能会发现延迟较慢/更快的设备。