Причина:
При вызове кода, который прокручивает просмотр списка до кнопки в методе OnElementChanged
. Просмотр списка еще не завершен init.Так что это не сработало.
Решение:
Вы можете использовать MessagingCenter
для отправки уведомления для прокрутки списка в методе OnAppearing
.
inyour contentPage
protected override void OnAppearing()
{
base.OnAppearing();
MessagingCenter.Send<Object>(this, "ScrollToButtom");
}
в iOS Renderer
public class NativeiOSListViewRenderer : ListViewRenderer
{
public NativeiOSListViewRenderer ()
{
MessagingCenter.Subscribe<Object>(this, "ScrollToButtom", (obj) => {
var element = Element as MyListView;
if (element.ItemsSource is IList<string> items && items.Count > 0)
{
var tableView = Control as UITableView;
var indexPath = NSIndexPath.FromItemSection(items.Count - 1, 0);
tableView.ScrollToRow(indexPath, UITableViewScrollPosition.Bottom, false);
}
});
}
}
Обновление: Решение отлично работает на моем устройстве. Если оновсе еще не работает в вашем проекте. Вы можете переопределить метод WillDisplay
public class MyListViewRenderer:ListViewRenderer,IUITableViewDelegate
{
bool isFirstLoad = true;
public MyListViewRenderer()
{
}
[Export("tableView:willDisplayCell:forRowAtIndexPath:")]
public void WillDisplay(UITableView tableView,UITableViewCell cell,NSIndexPath indexPath)
{
if(isFirstLoad)
{
var element = Element as MyListView;
if (element.ItemsSource is IList<string> items && items.Count > 0)
{
if(indexPath.Row!=items.Count-1)
{
NSIndexPath nSIndexPath = NSIndexPath.FromItemSection(indexPath.Row + 1, 0);
tableView.ScrollToRow(nSIndexPath, UITableViewScrollPosition.Bottom, false);
}
else
{
isFirstLoad = false;
}
}
}
}
protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
if(Control!=null)
{
Control.WeakDelegate = this;
}
}
}
Я загрузил свой образец здесь , вы можете загрузить его и попробовать.