背景 我们有一个页面,在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
答案 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()
-我不喜欢这种事情,因为设备上的时间有所不同,而且我可能会发现延迟较慢/更快的设备。