Xamarin.forms: [Error] [iOS] No se puede acceder a un objeto eliminado. Nombre del objeto: 'GroupableItemsViewController`1

Creado en 30 oct. 2019  ·  91Comentarios  ·  Fuente: xamarin/Xamarin.Forms

Descripción

Una vista de colección con encabezado provoca un bloqueo después de navegar a través del menú lateral de shell.
El error es solo para iOS. En Android funciona bien.

La aplicación no se bloqueará si usa pestañas.

Pasos para reproducir

  1. Abre la aplicación
  2. Utilice el menú lateral de shell para navegar a la página 2
  3. Utilice el menú lateral de shell para volver a la página 1

-> La aplicación se bloqueará

Comportamiento esperado

No chocar.

Comportamiento real

Lanza:

System.ObjectDisposedException: 'No se puede acceder a un objeto eliminado.
Nombre del objeto: 'GroupableItemsViewController`1'. '
y choques.

Información básica

  • Versión con problema: 4.3.0.947036, 4.3.0.908675, ..., 4.4.0.991265
  • Última versión buena conocida: 4.2.0.910310
  • IDE: Visual Studio 2019
  • Marcos de destino de la plataforma:

    • iOS: 13.1, 13.2 (probablemente otras versiones también)

Enlace de reproducción

BugExample.zip

collectionview high high impact iOS 🍎 bug

Comentario más útil

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:

[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

Todos 91 comentarios

¿Alguna idea para una solución alternativa?

Mismo comportamiento con TabBar . ¿Hay alguna investigación en curso?

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>

Registro de depuración

[UICollectionView] Actualización no válida: número no válido de elementos en la sección 0. El número de elementos contenidos en una sección existente después de la actualización (1) debe ser igual al número de elementos contenidos en esa sección antes de la actualización (1), más o menos el número de elementos insertados o eliminados de esa sección (1 insertado, 0 eliminado) y más o menos el número de elementos movidos dentro o fuera de esa sección (0 movidos hacia adentro, 0 movidos hacia afuera). - realizará reloadData. Instancia de UICollectionView:; capa =; contentOffset: {0, -100}; contentSize: {414, 45}; AdjustContentInset: {100, 0, 0, 0}; diseño:; fuente de datos:>; currentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: antiguo:nuevoartículos: <(
"Yo (0,0)"
)>]

Mensaje de excepción

No se puede acceder a un objeto eliminado.
Nombre del objeto: GroupableItemsViewController

Acabo de recibir este mismo error de una revisión de la aplicación que de otro modo funciona y que ha estado disponible durante un mes.

Ocurrió en iOS 12.4.1. Informe desde AppCenter, por lo que los detalles son limitados y no he podido reproducirlo. La mayoría de la gente parece no encontrarla nunca.

@BioTurboNick ¿ qué versión de Xamarin Forms usas? Porque tu problema se parece a otra cosa.
El error anterior es bastante fácil de reproducir y sucederá cada vez que cambie de página.

Hmm quizás sí. Estoy en 4.2.0.848062. Aún así, nunca antes había visto una ObjectDisposedException de GroupableItemsViewController.

Probé este error en 4.2.0.9 ... y funcionó bien. ¿Probablemente esto sea algo más?

Respecto a la versión de XF SDK: 4.3.0.947036 (última versión estable)

Presenté un nuevo problema porque está relacionado pero ocurre en un TabBar: https://github.com/xamarin/Xamarin.Forms/issues/8394

mismo tema viene pero sin agrupamiento. en formularios versión 4.3

Tuve el problema con una vista de colección con pie de página. La eliminación del pie de página parece haber resuelto el problema.

Sigo recibiendo este problema en 4.4.0.991265 No tengo un encabezado o pie de página en mi CollectionView y aún se bloquea.

Untitled

Recibo este error con una vista de colección simple (creo), estoy usando Xamarin Forms 4.4.0.991265, con una vista de lista funciona bien

  <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>

Se renderiza la primera vez, pero cuando hago una 'recarga en caliente' se rompe con:

System.ObjectDisposedException: no se puede acceder a un objeto eliminado.
Nombre del objeto: '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] en / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios mono / external / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 263
en 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 (índice System.Int32, elemento T) [0x0001a] en / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 196
en System.Collections.ObjectModel.Collection`1 [T] .Add (T item) [0x00020] in / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Common / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
en O.ViewModels.CashSummaryViewModel.ExecueLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] en /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019

Después de actualizar a 4.4.0.991265, me encuentro con esto nuevamente, incluso en vistas de colección sin encabezados o pies de página. :(

Solucione esto urgentemente. También tengo este problema. No se puede usar shell en producción debido a esto. Debe marcarse como crítico.

Pasos para reproducir
Abre la aplicación
Utilice el menú lateral de shell para navegar a la página 2
Utilice el menú lateral de shell para volver a la página 1
-> La aplicación se bloqueará

El mismo problema. ¿Por qué esto no se ha solucionado todavía?

Lo dicho @jsiemens 👆

También me enfrento a este problema en una vista de colección con o sin encabezado y pie de página. Usando Xamarin.Forms 4.4.0.991640

@hartez Gracias. Este es un error crítico que hace que el shell sea inutilizable en iOS.

Tengo el mismo problema y no puedo publicar una aplicación con errores ... ¡Por favor, corríjala!

El mismo problema aquí.

Mismo problema aquí

El mismo problema en 4.4.0.991640 sin shell, sin encabezado y sin pie de página.

También ocurre usando un CarouselView que imagino que tiene las mismas cosas debajo del capó

Vamos, equipo de Xamarin ... ¿Es realmente aceptable tener un error en producción durante 5 meses?

@PureWeen @hartez @samhouts

Nunca tuve este error antes de la 4.5.
Después de actualizar a 4.5, este error aparece en CollectionView (sin Shell).

El mismo problema aquí con Hot-Reload:
En mi caso un ListView

La vista:
'


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

'

ViewCell (la plantilla):
' 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>

'

Cada vez que cambio algo en la plantilla, presiono Guardar para iniciar la recarga en caliente, ocurre el error (iOS 13 dentro del Simulador; iOS 12 en un dispositivo real)

No sucede con todas las vistas de lista / plantilla y no sé cuál es la diferencia o cómo solucionarlo ... hasta ahora solo sucede con Hot-Reload, que es molesto pero no crítico, pero cuando leo eso, algunos de tienes esto en tiempo de ejecución normal, tengo un poco de miedo ...

Aquí hay un seguimiento de pila:

`No se puede acceder a un objeto eliminado.
Nombre del objeto: 'DefaultRenderer'.

en Foundation.NSObject.get_SuperHandle () [0x00012] en /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/Foundation/NSObject2.cs:449
en UIKit.UIView.set_Frame (valor de CoreGraphics.CGRect) [0x00024] en /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/UIView.g.cs:3684
en Xamarin.Forms.Platform.iOS.ViewCellRenderer + ViewTableCell.LayoutSubviews () [0x000a5] en D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ ViewCellRenderer.cs: 103
en (contenedor administrado a nativo) ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_Int64 (intptr, intptr, intptr, long)
en UIKit.UITableView.ReloadRows (Foundation.NSIndexPath [] atIndexPaths, UIKit.UITableViewRowAnimation withRowAnimation) [0x0002a] en /Library/Frameworks/Xamarin.iOS.framework/Versmarions/13.8.3.0/sITableView.gi .Xa cs: 824
en Xamarin.Forms.Platform.iOS.CellRenderer + <> c__DisplayClass8_0.b__0 (System.Object sender, System.EventArgs e) [0x00032] en D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ CellRenderer.cs: 106
en Xamarin.Forms.Cell.OnForceUpdateSizeRequested () [0x00076] en D: \ a \ 1 \ s \ Xamarin.Forms.Core \ Cells \ Cell.cs: 234 `

también tengo este problema en mi aplicación. eliminar el pie de página de la vista de colección en la página correspondiente con una vista de caja invisible de altura 100 (solo para agregar algo de espacio en la parte inferior de la vista) resuelve el problema.
hay otra cosa que funciona bien: tengo varias definiciones de elementos flotantes en mi página de shell. Si solo tengo una definición de elemento flotante, este problema no aparece. de modo que si puede diseñar el menú lateral de su shell de modo que cada contenido de shell esté en un elemento flotante, el problema está resuelto.

@Genfood en su proyecto de muestra, el problema es el encabezado de la vista de colección en ItemsPage. eliminarlo resuelve el problema, pero no debería bloquearse con o sin establecer un encabezado. Otra cosa que puede hacer, como se mencionó anteriormente, es combinar todos los elementos flotantes en uno. entonces también funcionará.

este error desagradable necesita ser arreglado

@samhouts ¿ Cuándo se lanzará la solución?

@samhouts Acabo de probar esa versión y el problema persiste.

System.ObjectDisposedException
Mensaje = No se puede acceder a un objeto eliminado.
Nombre del objeto: 'WkWebViewRenderer'.

También estoy enfrentando el mismo problema

@samhouts Esto no está arreglado.

Lo probé en el 4.6 estable recién lanzado. Y parece arreglado. 🎉
Al menos el ejemplo de error que adjunto a este problema funciona ahora.

@samhouts Está arreglado si tiene un CollectionView pero no si tiene un WebView. Eso todavía está roto. Probablemente algunos otros también.

@samhouts Acabo de probar esa versión y el problema persiste.

System.ObjectDisposedException
Mensaje = No se puede acceder a un objeto eliminado.
Nombre del objeto: 'WkWebViewRenderer'.

@ g4mb10r Ese es un error diferente de un control diferente al problema publicado originalmente. ObjectDisposedExceptions puede tener muchas causas.

Abra un nuevo problema con su información (que es un WkWebviewRenderer) e incluya cualquier otra información que tenga (seguimientos de pila, un proyecto de reproducción si es posible).

@samhouts Sigo experimentando este problema con CollectionViews en v1.6. Aquí está el rastro:

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

en UIKit.UIView.set_Frame (valor de CoreGraphics.CGRect) [0x00024] en /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS/UIView.g.cs:3685

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

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

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

en (contenedor administrado a nativo) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)

en UIKit.UIApplication.Main (System.String [] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] en /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS /UIKit/UIApplication.cs:86

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

en Logbook.iOS.Application.Main (System.String [] args) [0x00001] en C: \ Code \ Logbook \ Logbook \ Logbook.iOS \ Main.cs: 17

No he podido identificar exactamente lo que está causando el problema, pero tengo CollectionViews en varias pestañas dentro de flyoutitem usando Shell. Cada CollectionView usa encabezados de grupo.

Cargar una pestaña con CollectionView está bien, luego una segunda también está bien. El bloqueo se produce cuando trato de navegar de regreso a uno visto anteriormente.

Estoy trabajando para intentar replicar esto en un proyecto de muestra, pero hasta ahora no he podido. Además, no estoy experimentando ningún problema en Android.

EDITAR

Abrí un nuevo número 10953 porque parece que he encontrado la causa. No estoy seguro si está relacionado con el problema del póster original.

Esto todavía está roto en v4.7.0.1080 en iOS. Android está bien.

3x CollectionViews en 3x páginas diferentes, sin encabezados ni pies de página. No usa Shell, solo ContentPages normales.

Hot-Reload o no, no importa. La primera población de vista de colección está bien. Actualizarlo provoca el bloqueo. Y esta es probablemente la implementación más simple de vista de colección que existe.

Todos se rompen exactamente de la misma manera cuando se borra la colección ObservableCollection subyacente y luego se vuelve a llenar.

No puedo creer que esto siga funcionando después de casi 9 meses.

Si ayuda a alguien más que viene aquí después de que esto se haya cerrado, pero no arreglado, he notado que si introduzco un retraso muy corto (> 100 ms) entre la limpieza y la repoblación, eso parece ayudar. Aunque no soy fanático de introducir retrasos para "arreglar" las cosas.

Si intentas borrarlo usando un método diferente, por ejemplo, while observablecollection.count > 0 do observablecollection.removeat(0) (para borrarlo) y luego intentas repoblarlo demasiado rápido, a veces obtendrás una excepción diferente de SemaphoreSlim:

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

Lo mismo @wislon ☹️, uno que puede agregar que lo reproduzca en iOS v12.4 pero en v13.5 funciona sin aplastamientos

Actualizar:

Con la versión Xamarin.Forms 4.6.0.1180 este error no es reproducible en iOS v12.4

Todavía obtengo esto ejecutando la última versión de Xamarin.Forms con IOS 12.4.5

Puedo reproducir esto con iOS 12.4.1 (pero no 13.x) y Xamarin.Forms 4.7. Vuelve a abrir el error.

@robintschroeder , @ daves1992 ¿se puede reproducir utilizando BugExample?

@rmarinho Sí, acabo de probarlo en un Iphone 6 con 12.4.5 y pude reproducirlo usando BugExample por primera vez

System.ObjectDisposedException: 'No se puede acceder a un objeto eliminado.
Nombre del objeto: 'GroupableItemsViewController`1'. '

Probé con 4.8 en iOS 12.2 Simulator y parece funcionar.

Mi mal, olvidé actualizar Xamarin.Forms en la muestra. Actualicé a 4.8 y no he podido reproducir en la muestra o en mi aplicación desde ... estaré atento ya que no se reprodujo todas las veces el otro día y estaba 100% en 4.7.X

el error todavía existe en xamarin 4.8 (iphone 6, ios 12.4.6)

@rkarban ¿tienes un repositorio? Solo lo probé y no pude reproducirlo.

@rmarinho lamentablemente el repositorio es privado y no puedo dar acceso
aquí está el rastro de la pila
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (tamaño de CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (tamaño de CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(contenedor administrado a nativo) 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)

BugExample.zip

@rmarinho Logré replicarlo cambiando ligeramente la muestra.

Agregué un retraso de 100 ms para configurar la propiedad Elementos.

iphone 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",
        };
    }

Tengo el mismo problema en ios 12 incluso con Xamarin Forms 4.8. Collectionview se bloquea en estos dispositivos. Necesitamos reabrir este problema.

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:

[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:

[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

Gracias por compartir. Intentaré esto. También vemos una gran cantidad de bloqueos relacionados con este problema.

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:

[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

algunos héroes no usan capas

@rmarinho @samhouts ¿podemos reabrir este error? Me las arreglé para replicar nuevamente usando una versión ajustada del ejemplo, ver arriba y parece que más personas están teniendo el problema.

También tengo el mismo problema incluso con los últimos formularios. Sin Shell, sin encabezados ni pies de página.

Tengo el mismo problema, pero con un ListView en iPad con iOS 12.4.8 y un iPhone con iOS 12.4.1, pero no en dispositivos con iOS 13. Estoy en Xamarin Forms 4.7 SR5 dirigido a 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

¿Alguna solución para ListView?

@ rd09 ListView no usa un GroupableItemsViewController. ¿Seguro que no está utilizando CollectionView?

@ rd09 ListView no usa un GroupableItemsViewController. ¿Seguro que no está utilizando CollectionView?

Gracias por el aviso, tienes razón. De alguna manera asumí eso, pero después de revisar el código fuente y verificar, decidí aplicar la solución que

El uso de la solución alternativa @ l0gaw solucionó los bloqueos que estaba viendo anteriormente, pero ahora recibo otro bloqueo con la misma excepción pero con un seguimiento de pila diferente:

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

También estamos viendo esto solo en iOS 12, y hasta ahora no hemos encontrado una solución.

También tengo este error en iPad

  • XAMARIN 4.7
  • iOS 13.5.1

SIGABRT: No se puede acceder a un objeto eliminado.

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)

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:

[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

@ l0gaw ¿Necesito implementar solo CustomRenderer en el proyecto de iOS o necesito algo más en el proyecto principal?

@matheuscschenfeld En el proyecto iOS

También sigo experimentando este problema, la solución alternativa no soluciona esto

editar
Arreglé mi problema. Estaba haciendo un enlace a un comando modelo en lugar del comando viewmodel. Este enlace no se actualizó al alternar entre los modelos de vista. Entonces, en lugar de descartar un elemento de la colección en la nueva fuente del modelo de vista, quería eliminar un elemento de la colección que ya estaba eliminado.
Ya no tengo problemas al cambiar el enlace al modelo de vista en lugar del modelo.

Debe tener cuidado al usar la solución que se publicó porque la línea que establece SelectedItem en nulo desencadena el evento SelectedItem, por lo que si tiene un enlace bidireccional establecido para esa propiedad y no está buscando nulo, causará una excepción. Eliminé la línea por completo ya que no creo que sea necesaria para la solución.

@samhouts Cualquier actualización sobre si esto se recogerá muy pronto. El mismo problema también ocurre en Listview. Versión del formulario 4.7.0.1080

Supongo que esto se puede solucionar en Xamarin.Forms 5.xo tal vez esperar hasta MAUI. Espero estar equivocado

También estoy reproduciendo este problema en Xamarin 4.8 en el simulador de iOS

@samhouts @hartez Muchas personas todavía informan sobre este error bastante grande. El alcance de este error era demasiado pequeño para encapsular el problema real.

Es bastante impresionante que esto aún no se haya solucionado, también tengo este error, CollectionView nunca funcionó correctamente en iOS

La solución alternativa de @ l0gaw solía funcionar, pero ahora no. No puedo decir si es de la última actualización de iOS, o no, pero se está volviendo realmente molesto: se bloquea en todas partes desde una simple actualización / limpieza.

@mduchev También estoy viendo esto. Está sucediendo tanto en iOS 13 como en 14. Lo único que cambió para mí fue pasar a Xamarin.iOS 14. Intento ver si puedo encontrar una solución ahora.

Específicamente, aquí está la pila que veo ahora:

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)

Después de publicar la solución alternativa sugerida, ahora veo esta excepción en App Center: System.IndexOutOfRangeException: IItemsViewSource está vacío

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 ()

¿Estás eliminando un artículo de la colección? Si es así, es posible que haya tenido otro problema informado (que también estoy golpeando constantemente): https://github.com/xamarin/Xamarin.Forms/issues/9632. Si no, entonces supongo que, como dije anteriormente, la solución no está funcionando en todos los casos, desafortunadamente.

Pude recrear el último número que publiqué. Cuando navego a una pantalla donde tengo un CollectionView y lo modifico agregando o quitando un elemento, luego cerrando la pantalla se lanza esta excepción. Si voy a la misma pantalla y no modifico CollectionView, luego salgo de la pantalla, no se lanza la excepción. La solución todavía me funciona, sin embargo, tuve que refactorizar algunas áreas porque borrar CollectionView fallará. Por lo tanto, la solución definitivamente introducirá nuevos problemas. Creo que la apuesta más segura en este momento es no usar CollectionViews.

Tengo el mismo problema.
El escenario es

  • Crear una vista de carrusel
  • Use collectionview dentro de la plantilla de carruselview
  • Por ejemplo, haga clic en elementos de carrusel y elementos de colección; hacer que los estados cambien - cliecked
  • Intente actualizar alguna parte de xaml y verifique si la vista se actualizó mediante una recarga en caliente
  • Haga clic en carruselview - colecciónver elementos de nuevo

En ese momento, el error afecta mi experiencia.

  • Ocurre en modo de depuración con el simulador ios
  • Pero no pude reproducirlo en el dispositivo iPhone implementado con el modo de liberación.
  • El error es el caso solo en el modo de depuración para mí.

Sería mucho más fácil de solucionar si alguien pudiera proporcionar un proyecto de muestra con los últimos paquetes de Xamarin. Parece que no puedo identificar el caso exacto cuando esto sucede constantemente. Si alguien puede, proporcione un proyecto de demostración que describa el problema para que se pueda solucionar rápidamente.

@mduchev ¿

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

Solo pregunto ya que está algo enterrado en la avalancha de comentarios. ¿No te reproduce el problema?

@lafritay Desafortunadamente, no. Puedo lanzar el proyecto tanto en un simulador como en un dispositivo sin ningún problema. La navegación entre las páginas tampoco parece desencadenar la excepción.

@lafritay Desafortunadamente, no. Puedo lanzar el proyecto tanto en un simulador como en un dispositivo sin ningún problema. La navegación entre las páginas tampoco parece desencadenar la excepción.

¿Qué versión de IOS?

Logré replicarlo en 12.4.1 pero no creo que se repita en versiones posteriores.

Sería mucho más fácil de solucionar si alguien pudiera proporcionar un proyecto de muestra con los últimos paquetes de Xamarin. Parece que no puedo identificar el caso exacto cuando esto sucede constantemente. Si alguien puede, proporcione un proyecto de demostración que describa el problema para que se pueda solucionar rápidamente.

Tienes que estar en iOS 12 para volver a crear.

@ rd09 No es cierto. Veía el mismo error en dispositivos iOS 13 y ahora lo veo nuevamente en dispositivos iOS 14. Desafortunadamente, los proyectos de muestra no parecen recrear el problema, así que supongo que aún persiste en alguna otra forma.

@mduchev @ rd09 Pude obtener una reproducción simple:

Bugs.zip

Una vez que cargue la aplicación, espere a que se carguen los elementos. Luego haz lo siguiente:

  1. Navegue a la página Acerca de usando el menú
  2. Vuelva a la página de elementos (debe estar en blanco)
  3. Utilice "extraer para actualizar" para actualizar la página. La excepción debería ocurrir cuando los artículos terminen de cargarse.

La clave para que esto suceda es esta línea en ItemsPage.xaml.cs

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

El problema es que si CollectionView.ItemsSource se actualiza alguna vez, el ItemsViewSource que contiene el valor original nunca se elimina. Por lo tanto, conserva su controlador CollectionChanged y reacciona a los cambios. Si la colección se actualiza luego de navegar fuera de la página (digamos, debido a una llamada de red lenta), el ItemsViewSource malo accede al ItemsViewController desechado.

Creo que el problema es el método UpdateItemsSource en este archivo: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . No se deshace del valor que tiene ItemsSource aunque parece que posee la vida útil del objeto.

Esto parece estar confirmado por el hecho de que su contraparte de Android elimina el objeto (consulte UpdateItemsSource en este archivo: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Platform.Android / CollectionView / ItemsViewAdapter.cs)

Y creo que una de las principales razones por las que esto sigue sucediendo es que la solución alternativa que muchas personas están usando anula ItemsSource cuando se llama a dispose.

@lafritay Estoy usando esta solución que parece funcionar en pruebas cortas. Esto no soluciona la eliminación por completo cuando la fuente de recopilación cambia correctamente, pero evita los bloqueos que tuve

''
usando Example.Controls;
usando Example.iOS.Renderers;
usando Xamarin.Forms;
usando Xamarin.Forms.Platform.iOS;

[ensamblado: ExportRenderer (typeof (ExtendedCollectionView), typeof (ExtendedCollectionViewRender))]
espacio de nombres Example.iOS.Renderers
{
clase pública ExtendedCollectionViewRender: CollectionViewRenderer
{
protected override GroupableItemsViewControllerCreateController (GroupableItemsView itemsView, diseño ItemsViewLayout)
{
devolver nuevo CustomGroupableItemsViewController(itemsView, diseño);
}
}
}

usando Xamarin.Forms;
usando Xamarin.Forms.Platform.iOS;

espacio de nombres Example.iOS.Renderers
{
clase pública CustomGroupableItemsViewController: GroupableItemsViewController
donde TItemsView: GroupableItemsView
{
Public CustomGroupableItemsViewController (TItemsView selectableItemsView, ItemsViewLayout layout): base (selectableItemsView, layout)
{
}

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

}

usando el sistema;
usando Foundation;
usando Xamarin.Forms.Platform.iOS;

espacio de nombres Example.iOS.Renderers
{
clase interna EmptySource: IItemsViewSource
{
public 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 Aquí está mi solución completa:

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);
        }
    }
}

Encontré una solución para este error. Creo un renderizador personalizado para Collectionview y anulé el método Dispose.
Aquí está el código del renderizador personalizado:
[ensamblado: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espacio de nombres Project.iOS.Renderers
{
clase pública CustomCollectionViewRenderer: CollectionViewRenderer
{
anular protegido anular desechar (desechar bool)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (desechar);
}
}
}

@ l0gaw ¿Necesito implementar solo CustomRenderer en el proyecto de iOS o necesito algo más en el proyecto principal?

Esta solución funcionó en mi caso. Eliminé también la línea "ItemsView.SelectedItem = null" porque no es necesaria en mi caso, como dijo @ rd09 .

El mismo problema sucedió conmigo, ¿alguna solución o solución alternativa? ... este es el seguimiento de la pila ...
estoy usando la última versión estable de formularios xamarin
usando AppShell
sucede en iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (tamaño de CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (tamaño de CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(contenedor administrado a nativo) 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)

BugExample.zip

@rmarinho Logré replicarlo cambiando ligeramente la muestra.

Agregué un retraso de 100 ms para configurar la propiedad Elementos.

iphone 6
IOS 12.4.5
Xamarin.Forms 4.8

Esta reproducción ya no se bloquea a partir de 4.8.0.1364.

@mduchev @ rd09 Pude obtener una reproducción simple:

Bugs.zip

Esta reproducción ya no arroja la ObjectDisposedException en 5.0.0-pre3.

El mismo problema sucedió conmigo, ¿alguna solución o solución alternativa? ... este es el seguimiento de la pila ...
estoy usando la última versión estable de formularios xamarin

@ahmedroshdy ¿Está viendo esto usando Xamarin.Forms 4.8.0.1560?

¿Fue útil esta página
0 / 5 - 0 calificaciones