Xamarin.forms: [Ошибка] [iOS] Невозможно получить доступ к удаленному объекту. Имя объекта: 'GroupableItemsViewController`1

Созданный на 30 окт. 2019  ·  91Комментарии  ·  Источник: xamarin/Xamarin.Forms

Описание

Представление коллекции с заголовком вызывает сбой после перехода через всплывающее окно оболочки.
Ошибка только в iOS. На Андроиде работает нормально.

Приложение не вылетит, если вы используете вкладки.

Действия по воспроизведению

  1. Откройте приложение
  2. Используйте всплывающее меню оболочки для перехода на страницу 2
  3. Используйте всплывающее меню оболочки, чтобы вернуться на страницу 1

-> Приложение выйдет из строя

Ожидаемое поведение

Не рушится.

Фактическое поведение

Броски:

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту.
Имя объекта: 'GroupableItemsViewController`1'. '
и вылетает.

Основная информация

  • Версия с ошибкой: 4.3.0.947036, 4.3.0.908675, ..., 4.4.0.991265
  • Последняя известная хорошая версия: 4.2.0.910310
  • IDE: Visual Studio 2019
  • Целевая платформа платформы:

    • iOS: 13.1, 13.2 (возможно, и другие версии)

Ссылка на воспроизведение

BugExample.zip

collectionview high high impact iOS 🍎 bug

Самый полезный комментарий

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:

[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

Все 91 Комментарий

Есть идеи обходного пути?

Такое же поведение с TabBar . Ведется ли расследование?

AppShell.xaml



<!-- Your Pages -->
<TabBar Route="main">
    <Tab Title="Computers" Icon="computers.png" Route="computers">
        <ShellContent ContentTemplate="{DataTemplate computer:ComputersRootPage}" 
                      Title="Root"
                      Route="root"
                      />
    </Tab>
    <Tab Title="Favorites" Icon="favorites.png">
        <ShellContent ContentTemplate="{DataTemplate local:FavoritesPage}" />
    </Tab>
    <Tab Title="Active" Icon="active.png">
        <ShellContent ContentTemplate="{DataTemplate local:ActivePage}" />
    </Tab>
    <Tab Title="Users" Icon="users.png">
        <ShellContent ContentTemplate="{DataTemplate local:UsersPage}" />
    </Tab>
    <Tab Title="Account" Icon="account.png">
        <ShellContent ContentTemplate="{DataTemplate local:AccountPage}" />
    </Tab>
</TabBar>

Журнал отладки

[UICollectionView] Недействительное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (1), должно быть равно количеству элементов, содержащихся в этом разделе до обновления (1), плюс или минус количество элементов, вставленных или удаленных из этого раздела (1 вставлено, 0 удалено) и плюс или минус количество элементов, перемещенных в этот раздел или из него (0 перемещено, 0 перемещено). - выполнит reloadData. Экземпляр UICollectionView:; слой =; contentOffset: {0, -100}; contentSize: {414, 45}; AdjustContentInset: {100, 0, 0, 0}; макет:; источник данных:>; currentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: старый:новыйэлементы: <(
«Я (0,0)»
)>]

Сообщение об исключении

Нет доступа к удаленному объекту.
Имя объекта: GroupableItemsViewController

Я только что получил ту же ошибку из исправной версии приложения, которая отсутствовала в течение месяца.

Произошла на iOS 12.4.1. Отчет из AppCenter, поэтому подробности ограничены, и мне не удалось его воспроизвести. Большинство людей, кажется, никогда с этим не сталкиваются.

@BioTurboNick, какую версию Xamarin Forms вы используете? Потому что ваша проблема похожа на что-то другое.
Вышеуказанную ошибку довольно легко воспроизвести, и она будет происходить каждый раз, когда вы переключаетесь между страницами.

Хм, может и так. Я на 4.2.0.848062. Тем не менее, я никогда раньше не видел ObjectDisposedException от GroupableItemsViewController.

Я тестировал этот баг на 4.2.0.9 ... и он работал нормально. Наверное, это что-то другое?

Относительно версии XF SDK: 4.3.0.947036 (последняя стабильная)

Я зарегистрировал новую проблему, потому что она связана, но происходит на TabBar: https://github.com/xamarin/Xamarin.Forms/issues/8394

такая же проблема, но без группировки. в формах версии 4.3

У меня возникла проблема с представлением коллекции с нижним колонтитулом. Удаление нижнего колонтитула решило проблему.

Эта проблема по-прежнему возникает в 4.4.0.991265. У меня нет верхнего или нижнего колонтитула в моем CollectionView, и он все равно вылетает.

Untitled

Я получаю эту ошибку с простым (я думаю) представлением коллекции, я использую Xamarin Forms 4.4.0.991265, со списком все работает нормально

  <CollectionView Grid.Row="0" ItemsSource="{Binding Currencies}" IsGrouped="False">
                <CollectionView.ItemsLayout>
                   <GridItemsLayout Orientation="Horizontal" />
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Grid Padding="10">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="100" />
                                <RowDefinition Height="100" />
                            </Grid.RowDefinitions>
                            <Label Grid.Row="0" 
                                   Text="{Binding CCY}" 
                                   FontAttributes="Bold"
                                   FontFamily="AppleSDGothicNeo-UltraLight" 
                                   />
                            <Label Grid.Row="1"
                                   FontFamily="AppleSDGothicNeo-UltraLight" 

                                   TextColor="{Binding Path=Amount, Converter={StaticResource ValueToColorConverter}}"
                                   Text="{Binding ., Converter={StaticResource CurrencyConverter}}"

                                    />
                        </Grid>

                    </DataTemplate>
                </CollectionView.ItemTemplate>
        </CollectionView>

Он отрисовывается в первый раз, но когда я делаю «горячую перезагрузку», он прерывается:

System.ObjectDisposedException: невозможно получить доступ к удаленному объекту.
Имя объекта: 'GroupableItemsViewController 1'. at Foundation.NSObject.get_SuperHandle () [0x00012] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.2.0.42/src/Xamarin.iOS/Foundation/NSObject2.cs:449 at UIKit.UIViewController.get_IsViewLoaded () [0x00023] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.2.0.42/src/Xamarin.iOS/UIViewController.g.cs:2075 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.NotLoadedYet () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:142 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.Add (System.Collections.Specialized.NotifyCollectionChangedEventArgs args) [0x0000d] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:147 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.CollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) [0x00023] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:100 at (wrapper delegate-invoke) <Module>.invoke_void_object_NotifyCollectionChangedEventArgs(object,System.Collections.Specialized.NotifyCollectionChangedEventArgs) at System.Collections.ObjectModel.ObservableCollection 1 [T] .OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00018] в / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / моно / внешний / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 263
в System.Collections.ObjectModel.ObservableCollection 1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/external/mono/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:338 at System.Collections.ObjectModel.ObservableCollection 1 [T] .InsertItem (индекс System.Int32, элемент T) [0x0001a] в / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / внешний / моно / внешний / corefx / SRC / System.ObjectModel / SRC / System / Collections / ObjectModel / ObservableCollection.cs: 196
в System.Collections.ObjectModel.Collection`1 [T] .Add (T item) [0x00020] в / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Общий / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
в O.ViewModels.CashSummaryViewModel.ExecueLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] в /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019 г.

После обновления до 4.4.0.991265 я снова сталкиваюсь с этим - даже в представлениях коллекции без верхних или нижних колонтитулов. :(

Пожалуйста, исправьте это срочно. У меня тоже есть такая проблема. Из-за этого невозможно использовать оболочку в производстве. Следует пометить как критическое.

Действия по воспроизведению
Откройте приложение
Используйте всплывающее меню оболочки для перехода на страницу 2
Используйте всплывающее меню оболочки, чтобы вернуться на страницу 1
-> Приложение выйдет из строя

Та же проблема. Почему это еще не исправлено?

Что @jsiemens сказал 👆

Я также сталкиваюсь с этой проблемой при просмотре коллекции с верхним и нижним колонтитулами или без них. Использование Xamarin.Forms 4.4.0.991640

@hartez Спасибо. Это критическая ошибка, из-за которой оболочку невозможно использовать на iOS.

У меня такая же проблема, и я не могу опубликовать приложение с ошибками .... Пожалуйста, исправьте!

Здесь та же проблема.

Такая же проблема здесь

Та же проблема с 4.4.0.991640 без оболочки, без верхнего колонтитула и без нижнего колонтитула.

Также происходит с использованием CarouselView, который, как мне кажется, имеет то же самое под капотом

Да ладно, команда Xamarin ... Разве допустимо иметь сбой в производственной среде в течение 5 месяцев?

@PureWeen @hartez @samhouts

Никогда не было этой ошибки до 4.5.
После обновления до 4.5 эта ошибка появляется в CollectionView (без Shell).

Та же проблема здесь с горячей перезагрузкой:
В моем случае ListView

Вид:
`


    <StackLayout>
        <ListView x:Name="LvAbwesenheiten" BackgroundColor="Transparent" 
                  HasUnevenRows="True" 
                  ItemTemplate="{StaticResource AbwesenheitTemplateSelector}"
                  SeparatorVisibility="None"
                  />
  </StackLayout>

`

ViewCell (шаблон):
` xmlns: x = "http://schemas.microsoft.com/winfx/2009/xaml"
x: Class = "DATAflor.Team.DFViews.Urlaub.CustomCells.AbwesenheitCell">

    <StackLayout x:Name="StackLayoutMain" 
                 Orientation="Horizontal" 
                 HorizontalOptions="Fill" 
                 Padding="10" 

                 >
        <StackLayout.Resources>
            <Style x:Key="LabelStyleZeitraum" TargetType="Label">
                <Setter Property="TextColor" Value="{DynamicResource TextOnBackgroundColor}"/>
                <Setter Property="FontSize" Value="15"/>
            </Style>
            <Style x:Key="LabelStyleText" TargetType="Label">
                <Setter Property="TextColor" Value="{DynamicResource TextOnBackgroundColor}"/>
                <Setter Property="FontSize" Value="13"/>
            </Style>
        </StackLayout.Resources>
        <!--BackgroundColor="{Binding Path=BackgroundColor}"-->

        <StackLayout Orientation="Vertical" HorizontalOptions="FillAndExpand">

            <StackLayout Orientation="Horizontal">
                <Label Text="{Binding Von, StringFormat='{0:dd.MM.yyyy}'}" Style="{StaticResource LabelStyleZeitraum}" />
                <Label Text=" - " Style="{StaticResource LabelStyleZeitraum}"/>
                <Label Text="{Binding Bis, StringFormat='{0:dd.MM.yyyy}'}" Style="{StaticResource LabelStyleZeitraum}"/>
            </StackLayout>

            <Label Text="{Binding Text}" 
                   Style="{StaticResource LabelStyleText}"
                   />


        </StackLayout>



    </StackLayout>
</ViewCell.View>

`

Всякий раз, когда я что-то меняю в шаблоне, нажимаю Сохранить, чтобы запустить горячую перезагрузку, возникает ошибка (iOS 13 внутри симулятора; iOS 12 на реальном устройстве)

Не происходит с каждым Listview / Template, и я не знаю, в чем разница и как ее обойти ... до сих пор это происходит только с Hot-Reload, что раздражает, но не критично, но когда я читал это, некоторые из у вас это в обычном режиме работы, я немного боюсь ...

Вот трассировка стека:

`Невозможно получить доступ к удаленному объекту.
Имя объекта: DefaultRenderer.

в Foundation.NSObject.get_SuperHandle () [0x00012] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/Foundation/NSObject2.cs:449
в UIKit.UIView.set_Frame (значение CoreGraphics.CGRect) [0x00024] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/UIView.g.cs:3684
в Xamarin.Forms.Platform.iOS.ViewCellRenderer + ViewTableCell.LayoutSubviews () [0x000a5] в D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ ViewCellRenderer.cs: 103
в (оболочка, управляемая-родная) ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_Int64 (intptr, intptr, intptr, long)
в UIKit.UITableView.ReloadRows (Foundation.NSIndexPath [] вIndexPaths, UIKit.UITableViewRowAnimation withRowAnimation) [0x0002a] в /Library/Frameworks/Xamarin.iOS.framework/Versions.iOS/ITabler/13.8.3.0/s cs: 824
в Xamarin.Forms.Platform.iOS.CellRenderer + <> c__DisplayClass8_0.b__0 (отправитель System.Object, System.EventArgs e) [0x00032] в D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ CellRenderer.cs: 106
в Xamarin.Forms.Cell.OnForceUpdateSizeRequested () [0x00076] в D: \ a \ 1 \ s \ Xamarin.Forms.Core \ Cells \ Cell.cs: 234 `

у меня тоже есть эта проблема в моем приложении. удаление нижнего колонтитула представления коллекции на соответствующей странице с невидимым окном высотой 100 (просто чтобы добавить немного места внизу представления) решает проблему.
есть еще одна вещь, которая отлично работает: у меня есть несколько определений всплывающих элементов на моей странице оболочки. если у меня есть только одно определение всплывающего элемента, эта проблема не возникает. поэтому, если вам удастся спроектировать всплывающее окно оболочки так, чтобы все содержимое оболочки находилось в одном всплывающем элементе, проблема решена.

@Genfood в вашем демонстрационном проекте, проблема заключается в заголовке представления коллекции в ItemsPage. его удаление решает проблему, но он не должен давать сбоев с установкой заголовка или без него. еще одна вещь, которую вы можете сделать, как упомянуто выше, - это объединить все всплывающие элементы в один. тогда он тоже будет работать.

эту неприятную ошибку нужно исправить

@samhouts Когда будет выпущено исправление?

@ g4mb10r Это было выпущено в https://github.com/xamarin/Xamarin.Forms/releases/tag/beta-4.6.0-pre4.2.

@samhouts Я только что попробовал эту версию, но проблема не

System.ObjectDisposedException
Сообщение = Нет доступа к удаленному объекту.
Имя объекта: 'WkWebViewRenderer'.

У меня такая же проблема

@samhouts Это не исправлено.

Я тестировал его в недавно выпущенной стабильной версии 4.6. И вроде бы поправили. 🎉
По крайней мере, пример ошибки, который я прикрепил к этой проблеме, теперь работает.

@samhouts Это исправлено, если у вас есть CollectionView, но нет, если у вас есть WebView. Это все еще не работает. Наверное, еще несколько.

@samhouts Я только что попробовал эту версию, но проблема не

System.ObjectDisposedException
Сообщение = Нет доступа к удаленному объекту.
Имя объекта: 'WkWebViewRenderer'.

@ g4mb10r Это ошибка другого

Пожалуйста, откройте новую проблему со своей информацией (что это WkWebviewRenderer) и включите любую другую информацию, которая у вас есть (трассировки стека, проект воспроизведения, если возможно).

@samhouts У меня все еще

в Foundation.NSObject.get_SuperHandle () [0x00012] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS/Foundation/NSObject2.cs:449

в UIKit.UIView.set_Frame (значение CoreGraphics.CGRect) [0x00024] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS/UIView.g.cs:3685

в Xamarin.Forms.Platform.iOS.ItemsViewController`1 [TItemsView] .LayoutEmptyView () [0x0000f] в D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ CollectionViewItemsViewController.cs: 318

в Xamarin.Forms.Platform.iOS.ItemsViewController`1 [TItemsView] .ViewWillLayoutSubviews () [0x00046] в D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ CollectionViewItemsViewController.cs: 161

в Xamarin.Forms.Platform.iOS.StructuredItemsViewController`1 [TItemsView] .ViewWillLayoutSubviews () [0x00000] в D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ CollectionView \ StructuredItemsViewController.cs: 78

at (оболочка, управляемая встроенной) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)

в UIKit.UIApplication.Main (System.String [] args, участник System.IntPtr, делегат System.IntPtr) [0x00005] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS /UIKit/UIApplication.cs:86

в UIKit.UIApplication.Main (System.String [] args, System.String PrincipalClassName, System.String delegateClassName) [0x0000e] в /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS /UIKit/UIApplication.cs:65

в разделе "Журнал" .iOS.Application.Main (System.String [] args) [0x00001] в C: \ Code \ бортжурнал \ бортжурнал \ бортжурнал.iOS \ Main.cs: 17

Мне не удалось точно определить причину проблемы, но у меня есть CollectionViews на нескольких вкладках во всплывающем элементе с использованием Shell. Каждый CollectionView использует заголовки групп.

Загрузка вкладки с помощью CollectionView - это нормально, вторая - тоже нормально. Сбой происходит, когда я пытаюсь вернуться к ранее просмотренному.

Я работаю над попыткой воспроизвести это в образце проекта, но пока не могу. Также у меня нет проблем с Android.

РЕДАКТИРОВАТЬ

Я открыл новый выпуск №10953, поскольку, кажется, нашел причину. Не уверен, связано ли это с проблемой исходного плаката.

Это все еще не работает в версии 4.7.0.1080 для iOS. Андроид в порядке.

3x CollectionView на 3x разных страницах, без верхних и нижних колонтитулов. Не используя Shell, просто обычные ContentPages.

Hot-Reload или нет, не имеет значения. Население с первым просмотром коллекции в порядке. Его обновление вызывает сбой. И это, вероятно, самая простая реализация collectionview из существующих.

Все они ломаются точно так же, когда базовая ObservableCollection очищается и затем повторно заполняется.

Я не могу поверить, что это все еще не работает почти через 9 месяцев.

Если это поможет кому-то еще, кто приходит сюда после того, как это было закрыто, но не исправлено, я заметил, что если я введу очень короткую задержку (> 100 мс) между очисткой и повторным заселением, это, похоже, поможет. Я не фанат введения задержек, чтобы все «исправить».

Если вы попытаетесь очистить его другим способом, например while observablecollection.count > 0 do observablecollection.removeat(0) (чтобы очистить его), а затем попытаетесь повторно заселить его слишком быстро, иногда вы получите другое исключение из SemaphoreSlim:

System.Threading.SemaphoreFullException: Adding the specified count to the semaphore would cause it to exceed its maximum

Тот же

Обновить:

В версии Xamarin.Forms 4.6.0.1180 эта ошибка не воспроизводится в iOS v12.4.

Я все еще использую последнюю версию Xamarin.Forms под управлением IOS 12.4.5

Я могу воспроизвести это под управлением iOS 12.4.1 (но не 13.x) и Xamarin.Forms 4.7. Пожалуйста, откройте ошибку еще раз.

@robintschroeder , @ daves1992 можно ли воспроизвести с помощью BugExample?

@rmarinho Да, только что протестировал на Iphone 6 под управлением 12.4.5 и впервые смог воспроизвести с помощью BugExample

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту.
Имя объекта: 'GroupableItemsViewController`1'. '

Я тестировал 4.8 на iOS 12.2 Simulator и, похоже, работает.

Плохо, что я забыл обновить Xamarin.Forms в образце. Я обновился до 4.8 и не смог воспроизвести на образце или в моем приложении с тех пор ... я буду следить, так как он не воспроизводился каждый раз на днях, и я был на 100% на 4.7.X

ошибка все еще существует на xamarin 4.8 (iphone 6, ios 12.4.6)

@rkarban у вас есть репо? Я только что протестировал и не смог воспроизвести его.

@rmarinho, к сожалению, репо является частным, и я не могу предоставить доступ
вот трассировка стека
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (размер CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (размер CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(оболочка, управляемая встроенной) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (аргументы System.String [], участник System.IntPtr, делегат System.IntPtr)
UIApplication.Main (аргументы System.String [], имя основного класса System.String, имя класса делегата System.String)
Application.Main (System.String [] аргументы)

BugExample.zip

@rmarinho Мне удалось воспроизвести это, немного изменив образец.

Я добавил задержку 100 мс для установки свойства Items.

Айфон 6
IOS 12.4.5
Xamarin.Forms 4.8

    ObservableCollection<string> items;

    public ObservableCollection<string> Items
    {
        get { return items; }
        set 
        {
            SetProperty(ref items, value);
        }
    }

    public Command LoadItemsCommand { get; set; }

    public ItemsViewModel()
    {
        Title = "Browse";
        _= getItems();
    }

    async Task getItems()
    {
        await Task.Delay(100);
        Items = new ObservableCollection<string>
        {
            "Test",
            "Test",
            "Test",
            "Test",
            "Test",
        };
    }

У меня такая же проблема на ios 12 даже с Xamarin Forms 4.8. Collectionview дает сбой на этих устройствах. Нам нужно снова открыть эту проблему.

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:

[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:

[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

Спасибо, что поделился. Я попробую это. Мы также видим огромное количество сбоев по этой проблеме.

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:

[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

некоторые герои не носят плащи

@rmarinho @samhouts можем ли мы снова открыть эту ошибку? Мне удалось повторить репликацию снова, используя скорректированную версию образца (см. Выше), и, похоже, проблема возникает у большего числа людей.

У меня такая же проблема даже с последними формами. Без оболочки, без верхних и нижних колонтитулов.

У меня такая же проблема, но со ListView на iPad под управлением iOS 12.4.8 и iPhone под iOS 12.4.1, но не на устройствах с iOS 13. Я использую Xamarin Forms 4.7 SR5 для iOS 13.4.

Xamarin Exception Stack:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'GroupableItemsViewController`1'.
  at Foundation.NSObject.get_SuperHandle () <0x101941484 + 0x0009c> in <698888335fd24bdca1317448cda6f409#1ffb13f9a443e65aad81d66c194bad70>:0
  at UIKit.UICollectionViewController.get_CollectionView () <0x10191f038 + 0x0002f> in <698888335fd24bdca1317448cda6f409#1ffb13f9a443e65aad81d66c194bad70>:0
  at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].GetPrototype () <0x101e787f0 + 0x00113> in <c02bcffd65214bdd87ba2c816440c864#1ffb13f9a443e65aad81d66c194bad70>:0
  at Xamarin.Forms.Platform.iOS.ItemsViewLayout.DetermineCellSize () <0x101e7fde0 + 0x000a3> in <c02bcffd65214bdd87ba2c816440c864#1ffb13f9a443e65aad81d66c194bad70>:0
  at Xamarin.Forms.Platform.iOS.ListViewLayout.ConstrainTo (CoreGraphics.CGSize size) <0x101e80efc + 0x00037> in <c02bcffd65214bdd87ba2c816440c864#1ffb13f9a443e65aad81d66c194bad70>:0
  at Xamarin.Forms.Platform.iOS.ItemsViewLayout.UpdateConstraints (CoreGraphics.CGSize size) <0x101e7f944 + 0x0006b> in <c02bcffd65214bdd87ba2c816440c864#1ffb13f9a443e65aad81d66c194bad70>:0
  at Xamarin.Forms.Platform.iOS.ItemsViewLayout.InvalidateLayout () <0x101e80ac0 + 0x00043> in <c02bcffd65214bdd87ba2c816440c864#1ffb13f9a443e65aad81d66c194bad70>:0
  at (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) <0x1018fa618 + 0x0003f> in <698888335fd24bdca1317448cda6f409#1ffb13f9a443e65aad81d66c194bad70>:0
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) <0x1018fa570 + 0x00053> in <698888335fd24bdca1317448cda6f409#1ffb13f9a443e65aad81d66c194bad70>:0
  at FieldEdge.Mobile.Tablet.iOS.Application.Main (System.String[] args) <0x10054cbf8 + 0x00033> in <ca210f5f974b45669b487b30759435fc#1ffb13f9a443e65aad81d66c194bad70>:0

Есть ли обходные пути для ListView?

@ rd09 ListView не использует GroupableItemsViewController. Вы уверены, что не используете CollectionView?

@ rd09 ListView не использует GroupableItemsViewController. Вы уверены, что не используете CollectionView?

Спасибо за внимание, вы правы. Я почему-то предполагал это, но после просмотра исходного кода и проверки я решил применить обходной путь, опубликованный @ l0gaw, и он сработал.

Использование обходного пути

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'GroupableItemsViewController`1'.
  at Foundation.NSObject.get_SuperHandle () <0x101d8f3c0 + 0x0009c> in <698888335fd24bdca1317448cda6f409#b6c34173f62d398ef7bfb32c87027461>:0
  at UIKit.UIViewController.get_IsViewLoaded () <0x101d671f4 + 0x0000f> in <698888335fd24bdca1317448cda6f409#b6c34173f62d398ef7bfb32c87027461>:0
  at Xamarin.Forms.Platform.iOS.ObservableItemsSource.ReloadRequired () <0x1022cfc28 + 0x00017> in <f363ad1ddcfd4686ace46d6cfc5b07cf#b6c34173f62d398ef7bfb32c87027461>:0
  at Xamarin.Forms.Platform.iOS.ObservableItemsSource.Remove (System.Collections.Specialized.NotifyCollectionChangedEventArgs args) <0x1022d0e9c + 0x0013b> in <f363ad1ddcfd4686ace46d6cfc5b07cf#b6c34173f62d398ef7bfb32c87027461>:0
  at Xamarin.Forms.Platform.iOS.ObservableItemsSource.CollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs args) <0x1022d00a8 + 0x001bf> in <f363ad1ddcfd4686ace46d6cfc5b07cf#b6c34173f62d398ef7bfb32c87027461>:0
  at Xamarin.Forms.Platform.iOS.ObservableItemsSource.CollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) <0x1022007b0 + 0x00417> in <f363ad1ddcfd4686ace46d6cfc5b07cf#b6c34173f62d398ef7bfb32c87027461>:0
  at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) <0x100c355e8 + 0x0005b> in <624bcc4ce53347508a7b8fa821d78da4#b6c34173f62d398ef7bfb32c87027461>:0
  at Foundation.NSAsyncSynchronizationContextDispatcher.Apply () <0x101d8d5fc + 0x0002f> in <698888335fd24bdca1317448cda6f409#b6c34173f62d398ef7bfb32c87027461>:0
  at (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) <0x101d48708 + 0x0003f> in <698888335fd24bdca1317448cda6f409#b6c34173f62d398ef7bfb32c87027461>:0
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) <0x101d48660 + 0x00053> in <698888335fd24bdca1317448cda6f409#b6c34173f62d398ef7bfb32c87027461>:0
  at FieldEdge.Mobile.Tablet.iOS.Application.Main (System.String[] args) <0x1009aa488 + 0x00033> in <044acf8dc1f745b3bc6b51b04b6a2bae#b6c34173f62d398ef7bfb32c87027461>:0

Мы также видим это только в iOS 12 и пока не нашли обходного пути.

У меня тоже есть эта ошибка в iPad

  • XAMARIN 4.7
  • iOS 13.5.1

SIGABRT: нет доступа к удаленному объекту.

NSObject.get_SuperHandle ()
UIViewController.get_NavigationItem ()
NavigationRenderer+<>c__DisplayClass79_0.<SetMasterLeftBarButton>b__0 (UIKit.UIImage icon)
ImageElementManager.ApplyNativeImageAsync (Xamarin.Forms.BindableObject bindable, Xamarin.Forms.BindableProperty imageSourceProperty, System.Action`1[T] onSet, System.Action`1[T] onLoading, System.Threading.CancellationToken cancellationToken)
NavigationRenderer.SetMasterLeftBarButton (UIKit.UIViewController containerController, Xamarin.Forms.MasterDetailPage masterDetailPage)
AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state)
NSAsyncSynchronizationContextDispatcher.Apply ()
(wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate)
UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String[] args)

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:

[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

@ l0gaw Нужно ли мне реализовывать только CustomRenderer в проекте iOS или мне нужно что-то еще в основном проекте?

@matheuscschenfeld В проекте iOS

Эта проблема по-прежнему возникает, временное решение не устраняет ее.

редактировать
Я исправил свою проблему. Я делал привязку к команде модели вместо команды viewmodel. Эта привязка не обновлялась при переключении между моделями просмотра. Поэтому вместо того, чтобы отклонять элемент коллекции в новом источнике модели представления, он хотел удалить элемент из коллекции, который уже был удален.
Больше не возникает проблем при изменении привязки к модели представления вместо модели.

Вы должны быть осторожны, используя опубликованный обходной путь, потому что строка, которая устанавливает для SelectedItem значение null, запускает событие SelectedItem, поэтому, если у вас установлена ​​двусторонняя привязка к этому свойству и не проверяется значение null, это вызовет исключение. Я полностью удалил строку, так как не думаю, что это необходимо для временного решения.

@samhouts Любая информация о том, скоро ли это будет. Та же проблема возникает и в Listview. Версия формы 4.7.0.1080

Я предполагаю, что это может быть исправлено в Xamarin.Forms 5.x или, возможно, подождать до MAUI. Я надеюсь ошибиться

Я воспроизводю эту проблему также в Xamarin 4.8 на симуляторе iOS.

@samhouts @hartez Многие люди до сих пор сообщают об этой довольно крупной ошибке. Масштабы этой ошибки были слишком малы, чтобы описать реальную проблему.

Впечатляет, что это еще не исправлено, у меня тоже есть эта ошибка, CollectionView никогда не работал должным образом на iOS

Раньше обходной путь

@mduchev Я

В частности, вот стек, который я сейчас вижу:

NSObject.get_SuperHandle ()
UIViewController.get_IsViewLoaded ()
ObservableItemsSource.NotLoadedYet ()
ObservableItemsSource.ReloadRequired ()
ObservableItemsSource.Remove (System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
ObservableItemsSource.CollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
ObservableItemsSource.CollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state)
NSAsyncSynchronizationContextDispatcher.Apply ()
(wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate)
UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String[] args)

После публикации предлагаемого обходного пути я теперь вижу это исключение в Центре приложений: System.IndexOutOfRangeException: IItemsViewSource пуст

Xamarin.Forms.Platform.iOS
EmptySource.GetIndexForItem (System.Object item)
Xamarin.Forms.Platform.iOS
ItemsViewController`1[TItemsView].GetIndexForItem (System.Object item)
Xamarin.Forms.Platform.iOS
SelectableItemsViewController`1[TItemsView].SelectItem (System.Object selectedItem)
Xamarin.Forms.Platform.iOS
SelectableItemsViewController`1[TItemsView].UpdateNativeSelection ()
Xamarin.Forms.Platform.iOS
SelectableItemsViewRenderer`2[TItemsView,TViewController].UpdateNativeSelection ()
Xamarin.Forms.Platform.iOS
SelectableItemsViewRenderer`2[TItemsView,TViewController].UpdateItemsSource ()
Xamarin.Forms.Platform.iOS
ItemsViewRenderer`2[TItemsView,TViewController].OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs changedProperty)
Xamarin.Forms.Platform.iOS
StructuredItemsViewRenderer`2[TItemsView,TViewController].OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs changedProperty)
Xamarin.Forms.Platform.iOS
SelectableItemsViewRenderer`2[TItemsView,TViewController].OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs changedProperty)
Xamarin.Forms.Platform.iOS
GroupableItemsViewRenderer`2[TItemsView,TViewController].OnElementPropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs changedProperty)
(wrapper delegate-invoke) <Module>.invoke_void_object_PropertyChangedEventArgs(object,System.ComponentModel.PropertyChangedEventArgs)
Xamarin.Forms
BindableObject.OnPropertyChanged (System.String propertyName)
Xamarin.Forms
Element.OnPropertyChanged (System.String propertyName)
Xamarin.Forms
BindableObject.SetValueActual (Xamarin.Forms.BindableProperty property, Xamarin.Forms.BindableObject+BindablePropertyContext context, System.Object value, System.Boolean currentlyApplying, Xamarin.Forms.Internals.SetValueFlags attributes, System.Boolean silent)
Xamarin.Forms
BindableObject.SetValueCore (Xamarin.Forms.BindableProperty property, System.Object value, Xamarin.Forms.Internals.SetValueFlags attributes, Xamarin.Forms.BindableObject+SetValuePrivateFlags privateAttributes)
Xamarin.Forms
BindableObject.SetValue (Xamarin.Forms.BindableProperty property, System.Object value, System.Boolean fromStyle, System.Boolean checkAccess)
Xamarin.Forms
ItemsView.set_ItemsSource (System.Collections.IEnumerable value)
FieldEdge.Mobile.iOS.CustomRenderers
CustomCollectionViewRenderer.Dispose (System.Boolean disposing)
Foundation
NSObject.Dispose ()
Xamarin.Forms.Platform.iOS
VisualElementPackager.Dispose (System.Boolean disposing)
Xamarin.Forms.Platform.iOS
VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing)
Foundation
NSObject.Dispose ()
Xamarin.Forms.Platform.iOS
VisualElementPackager.Dispose (System.Boolean disposing)
Xamarin.Forms.Platform.iOS
VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing)
Foundation
NSObject.Dispose ()
Xamarin.Forms.Platform.iOS
VisualElementPackager.Dispose (System.Boolean disposing)
Xamarin.Forms.Platform.iOS
VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing)
Foundation
NSObject.Dispose ()
Xamarin.Forms.Platform.iOS
VisualElementPackager.Dispose (System.Boolean disposing)
Xamarin.Forms.Platform.iOS
VisualElementRenderer`1[TElement].Dispose (System.Boolean disposing)
Foundation
NSObject.Dispose ()
Xamarin.Forms.Platform.iOS
DisposeHelpers.DisposeModalAndChildRenderers (Xamarin.Forms.Element view)
Xamarin.Forms.Platform.iOS.Platform.Xamarin.Forms
INavigation.PopModalAsync (System.Boolean animated)
Xamarin.Forms
Application+NavigationImpl.OnPopModal (System.Boolean animated)
FieldEdge.Mobile.Shared.MVVMFramework
NavigationService+<>c__DisplayClass8_0.<CloseModal>b__0 ()

Вы удаляете предмет из коллекции? Если это так, то, возможно, вы столкнулись с другой проблемой (о которой я также постоянно сталкиваюсь) - https://github.com/xamarin/Xamarin.Forms/issues/9632. Если нет, то я полагаю, что, как я сказал выше, обходной путь, к сожалению, работает не во всех случаях.

Мне удалось воссоздать последний опубликованный мной выпуск. Когда я перехожу на экран, на котором у меня есть CollectionView, и я изменяю его, добавляя или удаляя элемент, а затем закрывая экран, выдается это исключение. Если я перейду на тот же экран и не изменю CollectionView, а затем выйду с экрана, исключение не будет выбрано. Обходной путь все еще работает для меня, хотя мне пришлось реорганизовать некоторые области, потому что очистка CollectionView приведет к сбою. Таким образом, обходной путь обязательно вызовет новые проблемы. Я думаю, что сейчас самый безопасный вариант - не использовать CollectionViews.

У меня такая же проблема.
Сценарий

  • Создайте представление карусели
  • Использовать collectionview внутри шаблона carouselview
  • Например, щелкните элементы карусели и элементы коллекции; сделать их состояния измененными - cliecked
  • Попробуйте обновить часть xaml и проверьте, обновлен ли вид с помощью горячей перезагрузки
  • Нажмите carouselview - collectionview items снова

На данный момент мой опыт вызывает ошибку.

  • Это происходит в режиме отладки с симулятором ios
  • Но я не мог воспроизвести его на устройстве iPhone, развернутом в режиме выпуска.
  • Ошибка у меня бывает только в режиме отладки.

Было бы намного проще исправить, если бы кто-нибудь мог предоставить образец проекта с последними пакетами Xamarin. Кажется, я не могу точно определить случай, когда это происходит постоянно. Если кто-то может, предоставьте демонстрационный проект с описанием проблемы, чтобы ее можно было быстро исправить.

@mduchev Вы видели этот комментарий от @ daves1992?

https://github.com/xamarin/Xamarin.Forms/issues/8308#issuecomment -672028716

Просто спрашиваю, потому что это несколько погребено под потоком комментариев. Разве это не воспроизводит проблему?

@lafritay К сожалению, нет. Я могу без проблем запустить проект как на симуляторе, так и на устройстве. Навигация между страницами также не вызывает исключения.

@lafritay К сожалению, нет. Я могу без проблем запустить проект как на симуляторе, так и на устройстве. Навигация между страницами также не вызывает исключения.

Какая версия IOS?

Мне удалось воспроизвести его в 12.4.1, но я не думаю, что он повторился в более поздних версиях.

Было бы намного проще исправить, если бы кто-нибудь мог предоставить образец проекта с последними пакетами Xamarin. Кажется, я не могу точно определить случай, когда это происходит постоянно. Если кто-то может, предоставьте демонстрационный проект с описанием проблемы, чтобы ее можно было быстро исправить.

Вы должны быть на iOS 12, чтобы воссоздать игру.

@ rd09 Неправда. Я видел ту же ошибку на устройствах iOS 13 и теперь снова вижу ее на устройствах iOS 14. К сожалению, образцы проектов, похоже, не воссоздают проблему, поэтому я полагаю, что она все еще сохраняется в какой-то другой форме.

репро + решение: https://github.com/xamarin/Xamarin.Forms/issues/11853

обходного пути нет.

@mduchev @ rd09 Мне удалось получить простое воспроизведение:

Bugs.zip

После загрузки приложения дождитесь загрузки элементов. Затем сделайте следующее:

  1. Перейдите на страницу "О программе" с помощью меню.
  2. Вернитесь на страницу элементов (она должна быть пустой)
  3. Используйте «потяните, чтобы обновить», чтобы обновить страницу. Исключение должно произойти, когда элементы загружаются.

Ключ к тому, чтобы это произошло, - это строка в ItemsPage.xaml.cs

        protected override void OnDisappearing()
        {
            ItemsCollectionView.ItemsSource = null;
            base.OnDisappearing();
        }

Проблема в том, что если CollectionView.ItemsSource когда-либо обновляется, ItemsViewSource , содержащий исходное значение, никогда не удаляется. Таким образом, он сохраняет свой обработчик CollectionChanged и реагирует на изменения. Если коллекция затем обновляется после перехода со страницы (скажем, из-за медленного сетевого вызова), плохой ItemsViewSource обращается к удаленному ItemsViewController .

Я считаю, что проблема заключается в методе UpdateItemsSource в этом файле: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . Он не избавляется от значения, хранящегося в ItemsSource хотя кажется, что ему принадлежит время жизни объекта.

Похоже, это подтверждается тем фактом, что его аналог в Android удаляет объект (см. UpdateItemsSource в этом файле: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Platform.Android / CollectionView / ItemsViewAdapter.cs).

И я думаю, что одна из основных причин, почему это продолжает происходить, заключается в том, что обходной путь, который многие люди используют, обнуляет ItemsSource при вызове dispose.

@lafritay Я использую этот обходной путь, который, похоже, работает при коротком тестировании. Это не исправляет удаление полностью, когда источник коллекции изменен правильно, но предотвращает сбои, которые у меня были

`` ''
using Example.Controls;
using Example.iOS.Renderers;
с помощью Xamarin.Forms;
с использованием Xamarin.Forms.Platform.iOS;

[сборка: ExportRenderer (typeof (ExtendedCollectionView), typeof (ExtendedCollectionViewRender))]
пространство имен Example.iOS.Renderers
{
открытый класс ExtendedCollectionViewRender: CollectionViewRenderer
{
защищенное переопределение GroupableItemsViewControllerCreateController (GroupableItemsView itemsView, макет ItemsViewLayout)
{
вернуть новый CustomGroupableItemsViewController(itemsView, макет);
}
}
}

с помощью Xamarin.Forms;
с использованием Xamarin.Forms.Platform.iOS;

пространство имен Example.iOS.Renderers
{
открытый класс CustomGroupableItemsViewController: GroupableItemsViewController
где TItemsView: GroupableItemsView
{
общедоступный CustomGroupableItemsViewController (TItemsView selectableItemsView, макет ItemsViewLayout): base (selectableItemsView, layout)
{
}

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
        ItemsSource = new EmptySource();
    }
}

}

используя Систему;
с помощью Foundation;
с использованием Xamarin.Forms.Platform.iOS;

пространство имен Example.iOS.Renderers
{
внутренний класс EmptySource: IItemsViewSource
{
общедоступный int GroupCount => 0;

    public int ItemCount => 0;

    public bool Loop { get ; set; }

    public int LoopCount => 0;

    public object this[NSIndexPath indexPath] => throw new IndexOutOfRangeException("IItemsViewSource is empty");

    public int ItemCountInGroup(nint group) => 0;

    public object Group(NSIndexPath indexPath)
    {
        throw new IndexOutOfRangeException("IItemsViewSource is empty");
    }

    public NSIndexPath GetIndexForItem(object item)
    {
        throw new IndexOutOfRangeException("IItemsViewSource is empty");
    }

    public void Dispose()
    {
    }
}

}

@jormenjanssen Вот мой полный обходной путь:

using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

namespace myTIPreport.iOS
{
    /// <summary>
    /// Needed because of this bug: https://github.com/xamarin/xamarin.forms/issues/10842. And this bug:
    /// https://github.com/xamarin/Xamarin.Forms/issues/9691
    /// </summary>
    internal sealed class DefaultCollectionItemsViewController : GroupableItemsViewController<GroupableItemsView>
    {
        public DefaultCollectionItemsViewController(GroupableItemsView itemsView, ItemsViewLayout itemsLayout)
            : base(itemsView, itemsLayout)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();

            // Needed because of this bug: https://github.com/xamarin/Xamarin.Forms/issues/9691
            CollectionView.ContentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.Automatic;
        }

        public override void UpdateItemsSource()
        {
            // Needed because of this bug: https://github.com/xamarin/Xamarin.Forms/issues/8308#issuecomment-710138958
            ItemsSource?.Dispose();
            base.UpdateItemsSource();
        }

        protected override UICollectionViewDelegateFlowLayout CreateDelegator() =>
            new DefaultCollectionItemsViewDelegator(ItemsViewLayout, this);
    }
}
using CoreGraphics;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

namespace myTIPreport.iOS
{
    /// <summary>
    /// Only needed because of this bug: https://github.com/xamarin/xamarin.forms/issues/10842
    /// </summary>
    internal sealed class DefaultCollectionItemsViewDelegator : SelectableItemsViewDelegator<GroupableItemsView, DefaultCollectionItemsViewController>
    {
        public DefaultCollectionItemsViewDelegator(
            ItemsViewLayout itemsLayout,
            DefaultCollectionItemsViewController itemsController)
            : base(itemsLayout, itemsController)
        {
        }

        /// <summary>
        /// Per default this method returns the Estimated size when its not overriden. This method is called
        /// before the rendering process and sizes the cell correctly before it is displayed in the
        /// CollectionView. Calling the base implementation of this method will throw an exception when
        /// overriding the method.
        /// </summary>
        public override CGSize GetSizeForItem(
            UICollectionView collectionView,
            UICollectionViewLayout layout,
            NSIndexPath indexPath)
        {
            // CellForItem() is not reliable here because when the cell at indexPath is not visible it will
            // return null.
            UICollectionViewCell cell = collectionView.CellForItem(indexPath);
            if (cell is ItemsViewCell itemsViewCell)
            {
                // Get the real cell size.
                return itemsViewCell.Measure();
            }
            else
            {
                // This is basically a fallback when CellForItem() returns null.
                return ItemsViewLayout.EstimatedItemSize;
            }
        }
    }
}

using myTIPreport.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(CollectionView), typeof(DefaultCollectionViewRenderer))]

namespace myTIPreport.iOS
{
    /// <summary>
    /// Reasons for this:
    /// 1. This bug: https://github.com/xamarin/xamarin.forms/issues/10842
    /// 2. This bug: https://github.com/xamarin/Xamarin.Forms/issues/8308
    /// </summary>
    internal class DefaultCollectionViewRenderer : GroupableItemsViewRenderer<GroupableItemsView, DefaultCollectionItemsViewController>
    {
        protected override DefaultCollectionItemsViewController CreateController(
            GroupableItemsView itemsView,
            ItemsViewLayout itemsLayout
        ) => new DefaultCollectionItemsViewController(itemsView, itemsLayout);

        protected override void Dispose(bool disposing)
        {
            // Workaround for this bug: https://github.com/xamarin/Xamarin.Forms/issues/8308
            ItemsView.SelectedItem = null;
            ItemsView.ItemsSource = null;

            base.Dispose(disposing);
        }
    }
}

Я нашел обходной путь для этой ошибки. Я создаю настраиваемое средство визуализации для Collectionview и отменяю метод Dispose.
Вот код настраиваемого отрисовщика:
[сборка: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
пространство имен Project.iOS.Renderers
{
открытый класс CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (удаление)
{
base.ItemsView.SelectedItem = ноль;
base.ItemsView.ItemsSource = null;
base.Dispose (утилизация);
}
}
}

@ l0gaw Нужно ли мне реализовывать только CustomRenderer в проекте iOS или мне нужно что-то еще в основном проекте?

В моем случае это обходное решение сработало. Я удалил также строку «ItemsView.SelectedItem = null», потому что в моем случае она не нужна, как и то, что сказал @ rd09 .

такая же проблема произошла со мной, какое-либо решение или обходной путь? ... это трассировка стека ...
Я использую последнюю стабильную версию из форм xamarin
с помощью AppShell
происходит в iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (размер CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (размер CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(оболочка, управляемая встроенной) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (аргументы System.String [], участник System.IntPtr, делегат System.IntPtr)
UIApplication.Main (аргументы System.String [], имя основного класса System.String, имя класса делегата System.String)
Application.Main (System.String [] аргументы)

BugExample.zip

@rmarinho Мне удалось воспроизвести это, немного изменив образец.

Я добавил задержку 100 мс для установки свойства Items.

Айфон 6
IOS 12.4.5
Xamarin.Forms 4.8

Это репро больше не вылетает с 4.8.0.1364.

@mduchev @ rd09 Мне удалось получить простое воспроизведение:

Bugs.zip

Это воспроизведение больше не вызывает исключение ObjectDisposedException в 5.0.0-pre3.

такая же проблема произошла со мной, какое-либо решение или обходной путь? ... это трассировка стека ...
Я использую последнюю стабильную версию из форм xamarin

@ahmedroshdy Вы видите это с помощью Xamarin.Forms 4.8.0.1560?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги