【问题标题】:Xamarin.Forms ScrollView ScrollToAsync() results in blank content on iOSXamarin.Forms ScrollView ScrollToAsync() 在 iOS 上导致空白内容
【发布时间】:2019-08-19 12:31:42
【问题描述】:

背景 我们有一个页面,我们在 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。

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

版本 Xamarin.Forms 3.4.0.1029999

=== Visual Studio Community 2017 for Mac ===

版本 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 框架 MDK ===

运行时: 单声道 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 支持的安卓版本: 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

=== 构建信息 ===

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

=== 操作系统 ===

Mac OS X 10.13.6 达尔文 17.7.0 达尔文内核版本 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

【问题讨论】:

    标签: xamarin.forms


    【解决方案1】:

    这个ScrollToAsync签名似乎在iOS上存在错误。

    更改为采用 Element 的 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() - 我不喜欢这种事情,因为设备上的时间不同,而且我可能会发现在较慢/较快的设备上延迟不够长.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多