Xamarin.forms: [Bug] [iOS] Auf ein entsorgtes Objekt kann nicht zugegriffen werden. Objektname: 'GroupableItemsViewController`1

Erstellt am 30. Okt. 2019  ·  91Kommentare  ·  Quelle: xamarin/Xamarin.Forms

Beschreibung

Eine Sammlungsansicht mit Kopfzeile verursacht einen Absturz, nachdem Sie über das Shell-Flyout navigiert haben.
Der Fehler ist nur iOS. Unter Android funktioniert es einwandfrei.

Die App stürzt nicht ab, wenn Sie Registerkarten verwenden.

Schritte zum Reproduzieren

  1. Öffnen Sie die App
  2. Verwenden Sie das Shell-Flyout, um zu Seite 2 zu navigieren
  3. Verwenden Sie das Shell-Flyout, um zu Seite 1 zurückzukehren

-> Die App stürzt ab

Erwartetes Verhalten

Nicht abstürzen.

Tatsächliches Verhalten

Würfe:

System.ObjectDisposedException: 'Kein Zugriff auf ein entsorgtes Objekt möglich.
Objektname: 'GroupableItemsViewController`1'. '
und stürzt ab.

Grundinformation

  • Version mit Problem: 4.3.0.947036, 4.3.0.908675, ..., 4.4.0.991265
  • Letzte bekannte gute Version: 4.2.0.910310
  • IDE: Visual Studio 2019
  • Plattform-Ziel-Frameworks:

    • iOS: 13.1, 13.2 (wahrscheinlich auch andere Versionen)

Reproduktionslink

BugExample.zip

collectionview high high impact iOS 🍎 bug

Hilfreichster Kommentar

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:

[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

Alle 91 Kommentare

Irgendwelche Ideen für eine Problemumgehung?

Gleiches Verhalten mit einer TabBar . Gibt es Ermittlungen?

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>

Austestungsprotokoll

[UICollectionView] Ungültige Aktualisierung: Ungültige Anzahl von Elementen in Abschnitt 0. Die Anzahl der Elemente, die in einem vorhandenen Abschnitt nach der Aktualisierung (1) enthalten sind, muss der Anzahl der in diesem Abschnitt enthaltenen Elemente vor der Aktualisierung (1) plus oder entsprechen abzüglich der Anzahl der Elemente, die in diesen Abschnitt eingefügt oder daraus gelöscht wurden (1 eingefügt, 0 gelöscht) und plus oder minus der Anzahl der Elemente, die in diesen Abschnitt eingefügt oder aus diesem entfernt wurden (0 eingezogen, 0 ausgezogen). - führt reloadData durch. UICollectionView-Instanz:;; Schicht =;; contentOffset: {0, -100}; contentSize: {414, 45}; adjustContentInset: {100, 0, 0, 0}; Layout:;; Datenquelle:>; currentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: alt:NeuGegenstände: <(
"I (0,0)"
)>]

Ausnahmemeldung

Kann nicht auf ein entsorgtes Objekt zugreifen.
Objektname: GroupableItemsViewController

Ich habe gerade den gleichen Fehler von einer ansonsten funktionierenden App-Revision erhalten, die seit einem Monat nicht mehr verfügbar ist.

Trat unter iOS 12.4.1 auf. Bericht aus dem AppCenter, daher sind die Details begrenzt und ich konnte ihn nicht reproduzieren. Die meisten Menschen scheinen nie darauf zu stoßen.

@BioTurboNick Welche Version von Xamarin Forms verwenden Sie? Weil dein Problem wie etwas anderes aussieht.
Der obige Fehler ist ziemlich einfach zu reproduzieren und tritt jedes Mal auf, wenn Sie zwischen den Seiten wechseln.

Hmm vielleicht schon. Ich bin am 4.2.0.848062. Trotzdem hatte ich noch nie zuvor eine ObjectDisposedException von GroupableItemsViewController gesehen.

Ich habe diesen Fehler auf 4.2.0.9 getestet ... und es hat gut funktioniert. Wahrscheinlich ist das etwas anderes?

In Bezug auf XF SDK Version: 4.3.0.947036 (letzter Stall)

Ich habe ein neues Problem eingereicht, da es verwandt ist, aber in einer TabBar auftritt: https://github.com/xamarin/Xamarin.Forms/issues/8394

Das gleiche Problem kommt aber ohne Gruppierung. in Formularen Version 4.3

Ich hatte das Problem mit einer Sammlungsansicht mit einer Fußzeile. Das Entfernen der Fußzeile scheint das Problem behoben zu haben.

Immer noch dieses Problem am 4.4.0.991265 Ich habe keine Kopf- oder Fußzeile in meiner CollectionView und es stürzt immer noch ab.

Untitled

Ich bekomme diesen Fehler mit einer einfachen (ich denke) Sammlungsansicht, ich verwende Xamarin Forms 4.4.0.991265, mit einer Listenansicht funktioniert es gut

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

Es wird das erste Mal gerendert, aber wenn ich ein "Hot Reload" mache, bricht es mit:

System.ObjectDisposedException: Kein Zugriff auf ein entsorgtes Objekt möglich.
Objektname: '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] in / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / xamarin-macios / mono / external / corefx / src / System.ObjectModel / src / System / Sammlungen / ObjectModel / ObservableCollection.cs: 263
at 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-Index, T-Element) [0x0001a] in / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / System.ObjectModel / src / System / Sammlungen / ObjectModel / ObservableCollection.cs: 196
unter System.Collections.ObjectModel.Collection`1 [T] .Add (T-Element) [0x00020] in / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Common / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
unter O.ViewModels.CashSummaryViewModel.ExecueLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] in /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019

Nach dem Update auf 4.4.0.991265 stoße ich erneut darauf - auch in Sammlungsansichten ohne Kopf- oder Fußzeilen. :(

Bitte beheben Sie dies dringend. Ich habe auch dieses Problem. Shell kann daher nicht in der Produktion verwendet werden. Sollte als kritisch markiert werden.

Schritte zum Reproduzieren
Öffnen Sie die App
Verwenden Sie das Shell-Flyout, um zu Seite 2 zu navigieren
Verwenden Sie das Shell-Flyout, um zu Seite 1 zurückzukehren
-> Die App stürzt ab

Gleiches Problem. Warum ist das noch nicht behoben?

Was @jsiemens gesagt hat 👆

Ich bin auch mit diesem Problem in einer Sammlungsansicht mit oder ohne Kopf- und Fußzeile konfrontiert. Verwenden von Xamarin.Forms 4.4.0.991640

@hartez Danke. Dies ist ein kritischer Fehler, der die Shell unter iOS unbrauchbar macht.

Ich habe das gleiche Problem und kann keine fehlerhafte App veröffentlichen. Bitte beheben Sie es!

Gleiches Problem hier.

Gleiches Problem hier

Gleiches Problem am 4.4.0.991640 ohne Shell, ohne Kopfzeile und ohne Fußzeile.

Kommt auch mit einem CarouselView vor, das meiner Meinung nach das gleiche Zeug unter der Haube hat

Komm schon, Xamarin-Team ... Ist es wirklich akzeptabel, dass 5 Monate lang ein Absturzfehler in der Produktion auftritt?

@PureWeen @hartez @samhouts

Hatte diesen Fehler noch nie vor 4.5.
Nach dem Update auf 4.5 erscheint dieser Fehler in einer CollectionView (ohne Shell).

Gleiches Problem hier mit Hot-Reload:
In meinem Fall eine ListView

Die Aussicht:
`


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

`

Die ViewCell (die Vorlage):
` 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>

`

Immer wenn ich etwas in der Vorlage ändere, drücke auf Speichern, um das Hot-Reload zu starten. Der Fehler tritt auf (iOS 13 im Simulator; iOS 12 auf einem echten Gerät).

Kommt nicht bei jeder Listenansicht / Vorlage vor und ich weiß nicht, was der Unterschied ist oder wie man es umgeht ... bis jetzt passiert es nur bei Hot-Reload, was nervig, aber nicht kritisch ist - aber wenn ich das lese, einige davon Sie haben dies zur normalen Laufzeit, ich habe ein bisschen Angst ...

Hier ist eine Stapelverfolgung:

`Kann nicht auf ein entsorgtes Objekt zugreifen.
Objektname: 'DefaultRenderer'.

unter Foundation.NSObject.get_SuperHandle () [0x00012] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/Foundation/NSObject2.cs:449
unter UIKit.UIView.set_Frame (CoreGraphics.CGRect-Wert) [0x00024] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/UIView.g.cs:3684
unter Xamarin.Forms.Platform.iOS.ViewCellRenderer + ViewTableCell.LayoutSubviews () [0x000a5] in D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ ViewCellRenderer.cs: 103
at (Wrapper Managed-to-Native) ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_Int64 (intptr, intptr, intptr, long)
at UIKit.UITableView.ReloadRows (Foundation.NSIndexPath [] atIndexPaths, UIKit.UITableViewRowAnimation withRowAnimation) [0x0002a] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/. cs: 824
bei Xamarin.Forms.Platform.iOS.CellRenderer + <> c__DisplayClass8_0.b__0 (System.Object-Absender, System.EventArgs e) [0x00032] in D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ CellRenderer.cs: 106
bei Xamarin.Forms.Cell.OnForceUpdateSizeRequested () [0x00076] in D: \ a \ 1 \ s \ Xamarin.Forms.Core \ Cells \ Cell.cs: 234 `

Ich habe auch dieses Problem in meiner App. Das Entfernen der Fußzeile der Sammlungsansicht auf der entsprechenden Seite mit einer unsichtbaren Boxansicht der Höhe 100 (nur um etwas Platz am unteren Rand der Ansicht hinzuzufügen) behebt das Problem.
Es gibt noch eine andere Sache, die gut funktioniert: Ich habe mehrere Flyoutitem-Definitionen in meiner Shellpage. Wenn ich nur eine Flyoutitem-Definition habe, tritt dieses Problem nicht auf. Wenn Sie es also schaffen, Ihr Shell-Flyout so zu gestalten, dass sich jeder Shell-Inhalt in einem Flyout-Element befindet, ist das Problem behoben.

@Genfood in Ihrem Beispielprojekt ist das Problem der Header der Sammlungsansicht in ItemsPage. Durch das Entfernen wird das Problem behoben, es sollte jedoch nicht mit oder ohne Setzen eines Headers abstürzen. Sie können auch, wie oben erwähnt, alle Flyout-Elemente zu einem kombinieren. dann wird es auch funktionieren.

Dieser böse Fehler muss behoben werden

@samhouts Wann wird das

@samhouts Ich habe gerade diese Version ausprobiert und das Problem besteht weiterhin.

System.ObjectDisposedException
Nachricht = Kein Zugriff auf ein entsorgtes Objekt möglich.
Objektname: 'WkWebViewRenderer'.

Ich stehe auch vor dem gleichen Problem

@samhouts Dies ist nicht behoben.

Ich habe es im neu veröffentlichten 4.6-Stall getestet. Und es scheint behoben zu sein. 🎉
Zumindest das Fehlerbeispiel, das ich diesem Problem beigefügt habe, funktioniert jetzt.

@samhouts Es ist behoben, wenn Sie eine CollectionView haben, aber nicht, wenn Sie eine WebView haben. Das ist immer noch kaputt. Wahrscheinlich auch ein paar andere.

@samhouts Ich habe gerade diese Version ausprobiert und das Problem besteht weiterhin.

System.ObjectDisposedException
Nachricht = Kein Zugriff auf ein entsorgtes Objekt möglich.
Objektname: 'WkWebViewRenderer'.

@ g4mb10r Das ist ein anderer Fehler als ein anderes Steuerelement als das ursprünglich veröffentlichte Problem. ObjectDisposedExceptions können viele Ursachen haben.

Bitte öffnen Sie eine neue Ausgabe mit Ihren Informationen (es handelt sich um einen WkWebviewRenderer) und geben Sie alle anderen Informationen an, die Sie haben (Stapelspuren, wenn möglich ein Repro-Projekt).

@samhouts Ich habe immer noch dieses Problem mit CollectionViews in Version 1.6. Hier ist die Spur:

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

unter UIKit.UIView.set_Frame (CoreGraphics.CGRect-Wert) [0x00024] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS/UIView.g.cs:3685

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

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

at Xamarin.Forms.Platform.iOS.StructuredItemsViewController`1 [TItemsView] .ViewWillLayoutSubviews () [0x00000] in D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ CollectionView \ StructuredItemsVers

at (Wrapper Managed-to-Native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)

at UIKit.UIApplication.Main (System.String [] args, System.IntPtr-Prinzipal, System.IntPtr-Delegat) [0x00005] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS /UIKit/UIApplication.cs:86

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

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

Ich konnte nicht genau feststellen, was das Problem verursacht, aber ich habe CollectionViews in mehreren Registerkarten innerhalb von Flyoutitem mithilfe von Shell. Jede CollectionView verwendet Gruppenheader.

Das Laden einer Registerkarte mit einer CollectionView ist in Ordnung, eine zweite ebenfalls. Der Absturz tritt auf, wenn ich versuche, zu einem zuvor angezeigten zurückzukehren.

Ich arbeite daran, dies in einem Beispielprojekt zu replizieren, konnte dies aber bisher nicht. Außerdem habe ich keine Probleme mit Android.

BEARBEITEN

Ich habe eine neue Ausgabe Nr. 10953 geöffnet, da ich anscheinend die Ursache gefunden habe. Ich bin mir nicht sicher, ob es mit der Ausgabe des Originalplakats zusammenhängt.

Dies ist in v4.7.0.1080 unter iOS immer noch nicht möglich. Android ist in Ordnung.

3x CollectionViews auf 3x verschiedenen Seiten, keine Kopf- oder Fußzeilen. Keine Shell verwenden, nur normale ContentPages.

Hot-Reload oder nicht, es spielt keine Rolle. Die erste Sammlung ist in Ordnung. Das Aktualisieren verursacht den Absturz. Und dies ist wahrscheinlich die einfachste Implementierung von Collectionview, die es gibt.

Alle von ihnen brechen genau auf die gleiche Weise, wenn die zugrunde liegende ObservableCollection gelöscht und dann neu gefüllt wird.

Ich kann nicht glauben, dass dies nach fast 9 Monaten immer noch kaputt ist.

Wenn es jemand anderem hilft, der hierher kommt, nachdem dies geschlossen, aber nicht behoben wurde, ist mir aufgefallen, dass es sehr hilfreich zu sein scheint, wenn ich eine sehr kurze Verzögerung (> 100 ms) zwischen Löschen und Wiederauffüllen einführe. Ich bin kein Fan von Verzögerungen, um Dinge zu "reparieren".

Wenn Sie versuchen, es mit einer anderen Methode zu löschen, z. B. while observablecollection.count > 0 do observablecollection.removeat(0) (um es zu löschen) und dann versuchen, es zu schnell wieder aufzufüllen, erhalten Sie manchmal eine andere Ausnahme als SemaphoreSlim:

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

Genau das gleiche @wislon ☹️, eines, das hinzufügen kann, dass es unter iOS v12.4 reproduziert, aber in v13.5 ohne Crushes funktioniert

Aktualisieren:

Mit der Version Xamarin.Forms 4.6.0.1180 dieser Fehler unter iOS v12.4 nicht reproduzierbar

Ich bekomme immer noch die neueste Version von Xamarin.Forms mit IOS 12.4.5

Ich kann dies unter iOS 12.4.1 (aber nicht 13.x) und Xamarin.Forms 4.7 wiederholen. Bitte öffnen Sie den Bug erneut.

@robintschroeder , @ daves1992 können Sie mit dem BugExample reproduzieren?

@rmarinho Ja, gerade auf einem Iphone 6 mit 12.4.5 getestet und konnte zum ersten Mal mit BugExample repro

System.ObjectDisposedException: 'Kein Zugriff auf ein entsorgtes Objekt möglich.
Objektname: 'GroupableItemsViewController`1'. '

Ich habe mit 4.8 auf iOS 12.2 Simulator getestet und scheint zu funktionieren.

Mein schlechtes Ich habe vergessen, Xamarin.Forms im Beispiel zu aktualisieren. Ich habe auf 4.8 aktualisiert und konnte das Beispiel oder meine App seitdem nicht mehr reproduzieren. Ich habe ein Auge darauf, da es nicht jedes Mal neu gedruckt wurde und ich zu 100% auf 4.7.X war

Der Fehler ist auf Xamarin 4.8 (iPhone 6, iOS 12.4.6) immer noch vorhanden.

@rkarban hast du ein repo? Ich habe es gerade getestet und konnte es nicht reproduzieren.

@rmarinho leider ist das repo privat und ich kann keinen
Hier ist Stack Trace
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (CoreGraphics.CGSize-Größe)
ItemsViewLayout.UpdateConstraints (CoreGraphics.CGSize-Größe)
ItemsViewLayout.InvalidateLayout ()
(Wrapper Managed-to-Native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] -Argumente, System.IntPtr-Prinzipal, System.IntPtr-Delegat)
UIApplication.Main (System.String [] args, System.String PrincipalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho Ich habe es geschafft, es zu replizieren, indem ich das Sample leicht

Ich habe dem Festlegen der Items-Eigenschaft eine Verzögerung von 100 ms hinzugefügt.

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

Ich habe das gleiche Problem auf iOS 12 auch mit Xamarin Forms 4.8. Collectionview stürzt auf diesen Geräten ab. Wir müssen dieses Problem erneut öffnen.

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:

[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:

[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

Danke für das Teilen. Ich werde es versuchen. Wir sehen auch eine große Anzahl von Abstürzen in Bezug auf dieses Problem.

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:

[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

Einige Helden tragen keine Umhänge

@rmarinho @samhouts können wir diesen Fehler wieder öffnen? Ich habe es geschafft, mit einer angepassten Version des Beispiels (siehe oben) erneut zu replizieren, und es scheint, dass mehr Leute das Problem haben.

Ich habe das gleiche Problem auch mit den neuesten Formularen. Keine Shell, keine Kopf- oder Fußzeilen.

Ich habe das gleiche Problem, aber mit einer ListView auf dem iPad unter iOS 12.4.8 und einem iPhone unter iOS 12.4.1, aber nicht auf Geräten unter iOS 13. Ich bin auf Xamarin Forms 4.7 SR5 mit 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

Gibt es Problemumgehungen für ListView?

@ rd09 ListView verwendet keinen GroupableItemsViewController. Sind Sie sicher, dass Sie keine CollectionView verwenden?

@ rd09 ListView verwendet keinen GroupableItemsViewController. Sind Sie sicher, dass Sie keine CollectionView verwenden?

Vielen Dank für das Heads-up, Sie haben Recht. Ich nahm das irgendwie an, aber nachdem ich den Quellcode durchgesehen und überprüft hatte, entschied ich mich, die Problemumgehung anzuwenden, die

Die Verwendung der @ 10gaw-Problemumgehung hat die Abstürze behoben, die ich zuvor gesehen habe, aber jetzt

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

Wir sehen dies auch nur unter iOS 12 und haben bisher keine Problemumgehung gefunden.

Ich habe diesen Fehler auch im iPad

  • XAMARIN 4.7
  • iOS 13.5.1

SIGABRT: Auf ein entsorgtes Objekt kann nicht zugegriffen werden.

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)

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:

[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

@ l0gaw Muss ich nur CustomRenderer im iOS-Projekt implementieren oder brauche ich etwas anderes im Hauptprojekt?

@matheuscschenfeld Im iOS-Projekt

Die Problemumgehung behebt dieses Problem immer noch nicht

bearbeiten
Ich habe mein Problem behoben. Ich habe eine Bindung an einen Modellbefehl anstelle eines Viewmodel-Befehls durchgeführt. Diese Bindung wurde beim Hin- und Herwechseln zwischen Ansichtsmodellen nicht aktualisiert. Anstatt ein Sammlungselement in der neuen Ansichtsmodellquelle zu verwerfen, wollte es ein Element aus der Sammlung entfernen, das bereits entsorgt wurde.
Kein Problem mehr beim Ändern der Bindung an das Ansichtsmodell anstelle des Modells.

Sie müssen vorsichtig sein, wenn Sie die Problemumgehung verwenden, die veröffentlicht wurde, da die Zeile, in der SelectedItem auf null gesetzt wird, das SelectedItem-Ereignis auslöst. Wenn Sie also eine bidirektionale Bindung für diese Eigenschaft festgelegt haben und nicht auf null prüfen, wird eine Ausnahme ausgelöst. Ich habe die Zeile vollständig entfernt, da ich nicht denke, dass dies für die Problemumgehung erforderlich ist.

@samhouts Jedes Update, ob dies sehr bald abgeholt wird. Das gleiche Problem tritt auch in Listview auf. Formularversion 4.7.0.1080

Ich vermute, dies kann auf Xamarin.Forms 5.x behoben sein oder vielleicht bis MAUI warten. Ich hoffe falsch zu liegen

Ich reproduziere dieses Problem auch auf Xamarin 4.8 im iOS-Simulator

@samhouts @hartez Viele Leute melden immer noch diesen ziemlich großen Fehler. Der Umfang dieses Fehlers war zu klein, um das eigentliche Problem zusammenzufassen.

Es ist ziemlich beeindruckend, dass dies noch nicht behoben wurde. Ich habe auch diesen Fehler. Die CollectionView hat unter iOS nie richtig funktioniert

Die Problemumgehung von @ l0gaw hat früher funktioniert, aber jetzt nicht mehr. Ich kann nicht sagen, ob es vom letzten iOS-Update stammt oder nicht, aber es wird wirklich nervig - stürzt überall durch einfaches Update / Löschen ab.

@mduchev Ich

Hier ist der Stapel, den ich jetzt sehe:

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)

Nach dem Veröffentlichen der vorgeschlagenen Problemumgehung wird diese Ausnahme jetzt im App Center

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

Entfernen Sie einen Artikel aus der Sammlung? Wenn ja, dann haben Sie möglicherweise ein anderes gemeldetes Problem festgestellt (das ich auch ständig treffe) - https://github.com/xamarin/Xamarin.Forms/issues/9632. Wenn nicht, dann denke ich, dass die Problemumgehung, wie oben erwähnt, leider nicht in allen Fällen funktioniert.

Ich konnte die letzte Ausgabe, die ich gepostet habe, neu erstellen. Wenn ich zu einem Bildschirm navigiere, auf dem sich eine Sammlungsansicht befindet, und diese durch Hinzufügen oder Entfernen eines Elements ändere und dann den Bildschirm schließe, wird diese Ausnahme ausgelöst. Wenn ich zum selben Bildschirm gehe und die CollectionView nicht ändere, verlasse ich den Bildschirm, und die Ausnahme wird nicht ausgelöst. Die Problemumgehung funktioniert immer noch für mich. Ich musste jedoch einige Bereiche umgestalten, da das Löschen der CollectionView abstürzt. Die Problemumgehung wird also definitiv neue Probleme einführen. Ich denke, die sicherste Wette zu diesem Zeitpunkt ist, CollectionViews nicht zu verwenden.

Ich habe das gleiche Problem.
Szenario ist

  • Erstellen Sie eine Karussellansicht
  • Verwenden Sie die Sammlungsansicht in der Karussellansicht-Vorlage
  • Klicken Sie beispielsweise auf Karussell- und Sammlungsgegenstände. machen sie Zustände geändert - cliecked
  • Versuchen Sie, einen xaml-Teil zu aktualisieren, und überprüfen Sie, ob die Ansicht per Hot-Reload aktualisiert wurde
  • Klicken Sie erneut auf Karussellansicht - Sammlungsansicht

An diesem Punkt wirft ein Fehler auf meine Erfahrung.

  • Dies geschieht im Debug-Modus mit dem iOS-Simulator
  • Aber ich konnte es nicht auf dem iPhone-Gerät reproduzieren, das im Release-Modus bereitgestellt wurde.
  • Fehler ist bei mir nur im Debug-Modus der Fall.

Es wäre viel einfacher zu beheben, wenn jemand ein Beispielprojekt mit den neuesten Xamarin-Paketen bereitstellen könnte. Ich kann anscheinend nicht in der Lage sein, den genauen Fall zu bestimmen, wenn dies ständig geschieht. Wenn jemand kann, stellen Sie bitte ein Demo-Projekt zur Verfügung, das das Problem beschreibt, damit es schnell behoben werden kann.

@mduchev Hast du diesen Kommentar von @ daves1992 gesehen?

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

Ich frage nur, da es etwas in der Flut von Kommentaren begraben ist. Gibt es das Problem nicht für Sie wieder?

@lafritay Leider nein. Ich kann das Projekt sowohl auf einem Simulator als auch auf einem Gerät ohne Probleme starten. Das Navigieren zwischen den Seiten scheint die Ausnahme ebenfalls nicht auszulösen.

@lafritay Leider nein. Ich kann das Projekt sowohl auf einem Simulator als auch auf einem Gerät ohne Probleme starten. Das Navigieren zwischen den Seiten scheint die Ausnahme ebenfalls nicht auszulösen.

Welche Version von IOS?

Ich habe es geschafft, es auf 12.4.1 zu replizieren, aber ich glaube nicht, dass es auf späteren Versionen repliziert wurde.

Es wäre viel einfacher zu beheben, wenn jemand ein Beispielprojekt mit den neuesten Xamarin-Paketen bereitstellen könnte. Ich kann anscheinend nicht in der Lage sein, den genauen Fall zu bestimmen, wenn dies ständig geschieht. Wenn jemand kann, stellen Sie bitte ein Demo-Projekt zur Verfügung, das das Problem beschreibt, damit es schnell behoben werden kann.

Sie müssen auf iOS 12 sein, um neu zu erstellen.

@ rd09 Nicht wahr. Ich habe den gleichen Fehler auf iOS 13-Geräten gesehen und jetzt sehe ich ihn wieder auf iOS 14-Geräten. Leider scheinen die Beispielprojekte das Problem nicht neu zu erstellen, sodass ich davon ausgehe, dass es in einer anderen Form weiterhin besteht.

Repro + -Lösung: https://github.com/xamarin/Xamarin.Forms/issues/11853

Keine Problemumgehung.

@mduchev @ rd09 Ich konnte einen einfachen Repro bekommen:

Bugs.zip

Warten Sie nach dem Laden der App, bis die Elemente geladen sind. Dann machen Sie folgendes:

  1. Navigieren Sie über das Menü zur Seite "Info"
  2. Navigieren Sie zurück zur Artikelseite (diese sollte leer sein).
  3. Verwenden Sie "Zum Aktualisieren ziehen", um die Seite zu aktualisieren. Die Ausnahme sollte auftreten, wenn die Elemente vollständig geladen sind.

Der Schlüssel dazu ist diese Zeile in ItemsPage.xaml.cs

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

Das Problem ist, dass, wenn CollectionView.ItemsSource jemals aktualisiert wird, die ItemsViewSource , die den ursprünglichen Wert enthalten, niemals entsorgt werden. Somit behält es seinen CollectionChanged -Handler bei und reagiert auf Änderungen. Wenn die Sammlung dann aktualisiert wird, nachdem Sie von der Seite weg navigiert haben (z. B. aufgrund eines langsamen Netzwerkanrufs), greift das fehlerhafte ItemsViewSource auf das entsorgte ItemsViewController .

Ich glaube, das Problem ist die UpdateItemsSource -Methode in dieser Datei: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . Der Wert von ItemsSource wird nicht entsorgt, obwohl er anscheinend die Lebensdauer des Objekts besitzt.

Dies scheint durch die Tatsache bestätigt zu werden, dass das Android-Gegenstück das Objekt entsorgt (siehe UpdateItemsSource in dieser Datei: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Plattform.Android / CollectionView / ItemsViewAdapter.cs)

Und ich denke, einer der Hauptgründe, warum dies weiterhin geschieht, ist, dass die Problemumgehung, die viele Leute verwenden, die ItemsSource beim Entsorgen auf Null setzt.

@lafritay Ich verwende diese

`` `
using Example.Controls;
using Example.iOS.Renderers;
mit Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[Assembly: ExportRenderer (typeof (ExtendedCollectionView), typeof (ExtendedCollectionViewRender))]
Namespace Example.iOS.Renderers
{
öffentliche Klasse ExtendedCollectionViewRender: CollectionViewRenderer
{
geschützte Überschreibung GroupableItemsViewControllerCreateController (GroupableItemsView itemsView, ItemsViewLayout-Layout)
{
Geben Sie den neuen CustomGroupableItemsViewController zurück(itemsView, Layout);
}}
}}
}}

mit Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

Namespace Example.iOS.Renderers
{
öffentliche Klasse CustomGroupableItemsViewController: GroupableItemsViewController
Dabei gilt TItemsView: GroupableItemsView
{
public CustomGroupableItemsViewController (TItemsView selectableItemsView, ItemsViewLayout-Layout): base (selectableItemsView, layout)
{
}}

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

}}

using System;
mit Foundation;
using Xamarin.Forms.Platform.iOS;

Namespace Example.iOS.Renderers
{
interne Klasse 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 Hier ist meine vollständige Problemumgehung:

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

Ich habe eine Problemumgehung für diesen Fehler gefunden. Ich erstelle einen benutzerdefinierten Renderer für Collectionview und habe die Methode Dispose überschrieben.
Hier ist der benutzerdefinierte Renderer-Code:
[Assembly: ExportRenderer (Typ (CollectionView), Typ (CustomCollectionViewRenderer))]
Namespace Project.iOS.Renderers
{
öffentliche Klasse CustomCollectionViewRenderer: CollectionViewRenderer
{
geschützte Übersteuerung nichtig Entsorgen (Bool Disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (Entsorgung);
}}
}}
}}

@ l0gaw Muss ich nur CustomRenderer im iOS-Projekt implementieren oder brauche ich etwas anderes im Hauptprojekt?

Diese Problemumgehung hat in meinem Fall funktioniert. Ich habe auch die Zeile "ItemsView.SelectedItem = null" entfernt, da sie in meinem Fall nicht benötigt wird, genau wie @ rd09 .

Das gleiche Problem ist bei mir aufgetreten, eine Lösung oder Problemumgehung? ... das ist die Stapelverfolgung ...
Ich verwende die neueste stabile Version von Xamarin-Formularen
mit AppShell
passiert in iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (CoreGraphics.CGSize-Größe)
ItemsViewLayout.UpdateConstraints (CoreGraphics.CGSize-Größe)
ItemsViewLayout.InvalidateLayout ()
(Wrapper Managed-to-Native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] -Argumente, System.IntPtr-Prinzipal, System.IntPtr-Delegat)
UIApplication.Main (System.String [] args, System.String PrincipalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho Ich habe es geschafft, es zu replizieren, indem ich das Sample leicht

Ich habe dem Festlegen der Items-Eigenschaft eine Verzögerung von 100 ms hinzugefügt.

iPhone 6
IOS 12.4.5
Xamarin.Forms 4.8

Dieser Repro stürzt ab 4.8.0.1364 nicht mehr ab.

@mduchev @ rd09 Ich konnte einen einfachen Repro bekommen:

Bugs.zip

Dieser Repro löst die ObjectDisposedException in 5.0.0-pre3 nicht mehr aus.

Das gleiche Problem ist bei mir aufgetreten, eine Lösung oder Problemumgehung? ... das ist die Stapelverfolgung ...
Ich verwende die neueste stabile Version von Xamarin-Formularen

@ahmedroshdy Sie sehen dies mit Xamarin.Forms 4.8.0.1560?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen