Xamarin.forms: [Bug] [iOS] Impossible d'accéder à un objet supprimé. Nom de l'objet: 'GroupableItemsViewController`1

Créé le 30 oct. 2019  ·  91Commentaires  ·  Source: xamarin/Xamarin.Forms

La description

Une vue de collection avec en-tête provoque un plantage après la navigation via le menu déroulant shell.
Le bogue concerne uniquement iOS. Sur Android, cela fonctionne bien.

L'application ne plantera pas si vous utilisez des onglets.

Étapes à suivre pour reproduire

  1. Ouvrez l'appli
  2. Utilisez le menu déroulant Shell pour accéder à la page 2
  3. Utilisez le menu déroulant Shell pour revenir à la page 1

-> L'application plantera

Comportement prévisible

Pas de crash.

Comportement réel

Jette:

System.ObjectDisposedException: 'Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'GroupableItemsViewController`1'. '
et se bloque.

Informations de base

  • Version avec problème: 4.3.0.947036, 4.3.0.908675, ..., 4.4.0.991265
  • Dernière bonne version connue: 4.2.0.910310
  • IDE: Visual Studio 2019
  • Cadres cibles de plate-forme:

    • iOS: 13.1, 13.2 (probablement d'autres versions aussi)

Lien de reproduction

BugExample.zip

collectionview high high impact iOS 🍎 bug

Commentaire le plus utile

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:

[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

Tous les 91 commentaires

Des idées pour une solution de contournement?

Même comportement avec un TabBar . Une enquête est-elle en cours?

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>

Journal de débogage

[UICollectionView] Mise à jour non valide: nombre d'éléments non valide dans la section 0. Le nombre d'éléments contenus dans une section existante après la mise à jour (1) doit être égal au nombre d'éléments contenus dans cette section avant la mise à jour (1), plus ou moins le nombre d'éléments insérés ou supprimés de cette section (1 inséré, 0 supprimé) et plus ou moins le nombre d'éléments déplacés dans ou hors de cette section (0 déplacés vers l'intérieur, 0 déplacés vers l'extérieur). - exécutera reloadData. Instance UICollectionView:; couche =; contentOffset: {0, -100}; contentSize: {414, 45}; AdjustContentInset: {100, 0, 0, 0}; disposition:; la source de données:>; currentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: ancien:Nouveauéléments: <(
"I (0,0)"
)>]

Message d'exception

Impossible d'accéder à un objet supprimé.
Nom de l'objet: GroupableItemsViewController

Je viens de recevoir la même erreur d'une révision d'application qui fonctionne autrement et qui est sortie depuis un mois.

S'est produit sur iOS 12.4.1. Rapport d'AppCenter, donc les détails sont limités et je n'ai pas pu le reproduire. La plupart des gens semblent ne jamais le rencontrer.

@BioTurboNick quelle version de Xamarin Forms utilisez-vous? Parce que votre problème ressemble à autre chose.
L'erreur ci-dessus est assez facile à reproduire et se produira chaque fois que vous basculerez entre les pages.

Hmm peut-être. Je suis sur 4.2.0.848062. Pourtant, je n'avais jamais vu une ObjectDisposedException de GroupableItemsViewController avant maintenant, jamais.

J'ai testé ce bogue sur 4.2.0.9 ... et cela a bien fonctionné. C'est probablement autre chose?

Concernant la version du SDK XF: 4.3.0.947036 (dernière version stable)

J'ai déposé un nouveau problème car il est lié mais se produit sur un TabBar: https://github.com/xamarin/Xamarin.Forms/issues/8394

même problème, mais sans regroupement. dans la version 4.3 des formulaires

J'ai eu le problème avec une vue de collection avec un pied de page. La suppression du pied de page semble avoir résolu le problème.

Je reçois toujours ce problème sur 4.4.0.991265 Je n'ai pas d'en-tête ou de pied de page dans ma CollectionView et il plante toujours.

Untitled

J'obtiens ce bogue avec une vue de collection simple (je pense), j'utilise Xamarin Forms 4.4.0.991265, avec une liste, cela fonctionne 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>

Il est rendu la première fois, mais lorsque je fais un `` rechargement à chaud '', il rompt avec:

System.ObjectDisposedException: impossible d'accéder à un objet supprimé.
Nom de l'objet: '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] dans / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / externe / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 263
à System.Collections.ObjectModel.ObservableCollection 1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/external/mono/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:338 at System.Collections.ObjectModel.ObservableCollection 1 [T] .InsertItem (index System.Int32, élément T) [0x0001a] dans / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / externe / mono / externe / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 196
à System.Collections.ObjectModel.Collection`1 [T] .Add (élément T) [0x00020] dans / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Commun / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
à O.ViewModels.CashSummaryViewModel.ExecueLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] dans /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019

Après la mise à jour vers 4.4.0.991265, je rencontre à nouveau cela - même sur des vues de collection sans en-têtes ou pieds de page. :(

Veuillez résoudre ce problème de toute urgence. J'ai aussi ce problème. Impossible d'utiliser le shell en production à cause de cela. Doit être marqué comme critique.

Étapes à suivre pour reproduire
Ouvrez l'appli
Utilisez le menu déroulant Shell pour accéder à la page 2
Utilisez le menu déroulant Shell pour revenir à la page 1
-> L'application plantera

Même problème. Pourquoi n'est-ce pas encore réglé?

Ce que @jsiemens a dit 👆

Je suis également confronté à ce problème dans une vue de collection avec ou sans en-tête et pied de page. Utilisation de Xamarin.Forms 4.4.0.991640

@hartez Merci. Il s'agit d'un bogue critique qui rend le shell inutilisable sur iOS.

J'ai le même problème et je ne peux pas publier une application boguée .... Veuillez le réparer!

Même problème ici.

Même problème ici

Même problème sur 4.4.0.991640 sans shell, sans en-tête et sans pied de page.

Se produit également en utilisant un CarouselView qui, j'imagine, a les mêmes choses sous le capot

Allez, équipe Xamarin ... Est-il vraiment acceptable d'avoir un bug qui plante en production pendant 5 mois?

@PureWeen @hartez @samhouts

Jamais eu ce bug avant la 4.5.
Après la mise à jour vers 4.5, ce bogue apparaît sur un CollectionView (sans Shell).

Même problème ici avec le rechargement à chaud:
Dans mon cas, un ListView

La vue:
»


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

»

La ViewCell (le modèle):
» 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>

»

Chaque fois que je change quelque chose dans le modèle, appuyez sur Enregistrer pour lancer le rechargement à chaud, l'erreur se produit (iOS 13 dans Simulator; iOS 12 sur un appareil réel)

Cela ne se produit pas avec chaque liste / modèle et je ne sais pas quelle est la différence ou comment la contourner ... jusqu'à présent, cela ne se produit qu'avec Hot-Reload, ce qui est ennuyeux mais pas critique - mais quand je lis que certains vous avez ceci à l'exécution normale, j'ai un peu peur ...

Voici un Stack-Trace:

`Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'DefaultRenderer'.

à Foundation.NSObject.get_SuperHandle () [0x00012] dans /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/Foundation/NSObject2.cs:449
à UIKit.UIView.set_Frame (valeur CoreGraphics.CGRect) [0x00024] dans /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/UIView.g.cs:3684
à Xamarin.Forms.Platform.iOS.ViewCellRenderer + ViewTableCell.LayoutSubviews () [0x000a5] dans 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)
à UIKit.UITableView.ReloadRows (Foundation.NSIndexPath [] atIndexPaths, UIKit.UITableViewRowAnimation withRowAnimation) [0x0002a] dans /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3UIT.0/src/XamarableView.iOS/. cs: 824
à Xamarin.Forms.Platform.iOS.CellRenderer + <> c__DisplayClass8_0.b__0 (expéditeur System.Object, System.EventArgs e) [0x00032] dans D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ CellRenderer.cs: 106
à Xamarin.Forms.Cell.OnForceUpdateSizeRequested () [0x00076] dans D: \ a \ 1 \ s \ Xamarin.Forms.Core \ Cells \ Cell.cs: 234 `

J'ai également ce problème dans mon application. la suppression du pied de page de la vue de collection dans la page correspondante avec une vue de boîte invisible de hauteur 100 (juste pour ajouter de l'espace en bas de la vue) résout le problème.
il y a une autre chose qui fonctionne bien: j'ai plusieurs définitions de flyoutitem dans ma page shell. si je n'ai qu'une seule définition flyoutitem, ce problème n'apparaît pas. ainsi, si vous parvenez à concevoir votre icône déroulante de manière à ce que chaque contenu du shell soit dans un élément volant, le problème est résolu.

@Genfood sur votre exemple de projet, le problème est l'en-tête de la vue de collection dans ItemsPage. le supprimer résout le problème, mais il ne devrait pas planter avec ou sans définir un en-tête. une autre chose que vous pouvez faire, comme mentionné ci-dessus, est de combiner tous les éléments volants en un seul. alors cela fonctionnera aussi.

ce vilain bogue doit être corrigé

@samhouts Quand le correctif sera-t-il publié?

@samhouts Je viens d'essayer cette version et le problème persiste.

System.ObjectDisposedException
Message = Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'WkWebViewRenderer'.

Je suis également confronté au même problème

@samhouts Ce n'est pas corrigé.

Je l'ai testé dans la nouvelle version 4.6 stable. Et cela semble être corrigé. 🎉
Au moins, l'exemple de bogue que j'ai joint à ce problème fonctionne maintenant.

@samhouts C'est corrigé si vous avez une CollectionView mais pas si vous avez une WebView. C'est toujours cassé. Probablement quelques autres aussi.

@samhouts Je viens d'essayer cette version et le problème persiste.

System.ObjectDisposedException
Message = Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'WkWebViewRenderer'.

@ g4mb10r C'est une erreur différente d'un contrôle différent du problème publié d'origine. ObjectDisposedExceptions peut avoir de nombreuses causes.

Veuillez ouvrir un nouveau problème avec vos informations (qu'il s'agit d'un WkWebviewRenderer) et veuillez inclure toute autre information que vous avez (traces de pile, un projet de repro si possible).

@samhouts Je rencontre toujours ce problème avec CollectionViews dans la v1.6. Voici la trace:

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

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

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

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

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

at (wrapper géré vers natif) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)

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

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

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

Je n'ai pas pu identifier exactement la cause du problème, mais j'ai CollectionViews dans plusieurs onglets de flyoutitem à l'aide de Shell. Chaque CollectionView utilise des en-têtes de groupe.

Le chargement d'un onglet avec un CollectionView est très bien, puis un deuxième est également très bien. Le crash se produit lorsque j'essaie de revenir à un fichier précédemment consulté.

Je travaille à essayer de reproduire cela dans un exemple de projet, mais je n'ai pas été en mesure de le faire jusqu'à présent. De plus, je ne rencontre aucun problème sur Android.

ÉDITER

J'ai ouvert un nouveau numéro # 10953 car il me semble avoir trouvé la cause. Je ne sais pas si cela est lié au problème de l'affiche originale.

Ceci est toujours cassé dans la v4.7.0.1080 sur iOS. Android va bien.

3x CollectionViews sur 3x pages différentes, sans en-tête ni pied de page. Ne pas utiliser Shell, juste ContentPages normal.

Hot-Reload ou pas, peu importe. La première population vue de collection est très bien. L'actualisation provoque le crash. Et c'est probablement l'implémentation la plus simple de collectionview qui soit.

Tous se cassent exactement de la même manière lorsque l'ObservableCollection sous-jacente est effacée puis repeuplée.

Je ne peux pas croire que cela soit toujours embrouillé après près de 9 mois.

Si cela aide quelqu'un d'autre qui vient ici après que cela ait été fermé, mais pas corrigé, j'ai remarqué que si j'introduis un délai très court (> 100 ms) entre la compensation et le repeuplement, cela semble aider. Je ne suis pas fan de l'introduction de retards pour «réparer» les choses.

Si vous essayez de l'effacer en utilisant une méthode différente, par exemple while observablecollection.count > 0 do observablecollection.removeat(0) (pour l'effacer) et que vous essayez de le repeupler trop rapidement, vous obtiendrez parfois une exception différente de SemaphoreSlim:

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

Juste le même @wislon ☹️, celui qui peut ajouter qui le reproduit sous iOS v12.4 mais en v13.5 fonctionne sans béguin

Mettre à jour:

Avec la version Xamarin.Forms 4.6.0.1180 ce bogue n'est pas reproductible sous iOS v12.4

Je reçois toujours cela en exécutant la dernière version de Xamarin.Forms exécutant IOS 12.4.5

Je peux reproduire cela sous iOS 12.4.1 (mais pas 13.x) et Xamarin.Forms 4.7. Veuillez ouvrir à nouveau le bogue.

@robintschroeder , @ daves1992 pouvez-vous reproduire en utilisant BugExample?

@rmarinho Oui, juste testé sur un Iphone 6 exécutant 12.4.5 et a pu reproduire en utilisant BugExample la première fois

System.ObjectDisposedException: 'Impossible d'accéder à un objet supprimé.
Nom de l'objet: 'GroupableItemsViewController`1'. '

J'ai testé avec 4.8 sur le simulateur iOS 12.2 et semble fonctionner.

Mon mauvais j'ai oublié de mettre à jour Xamarin.Forms dans l'exemple. J'ai mis à jour en 4.8 et je n'ai pas pu reproduire sur l'échantillon ou mon application depuis ... mal garder un œil car il n'a pas été reproduit à chaque fois l'autre jour et j'étais à 100% sur 4.7.X

le bogue existe toujours sur xamarin 4.8 (iphone 6, ios 12.4.6)

@rkarban avez-vous un repo? Je viens de tester et je n'ai pas pu le reproduire.

@rmarinho, malheureusement, le
voici la trace de pile
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (taille CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (taille CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(wrapper géré en natif) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] args, principal System.IntPtr, délégué System.IntPtr)
UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho J'ai réussi à le reproduire en changeant légèrement l'échantillon.

J'ai ajouté un délai de 100 ms pour définir la propriété Items.

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

J'ai le même problème sur iOS 12 même avec Xamarin Forms 4.8. Collectionview plante sur ces appareils. Nous devons rouvrir ce numéro.

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:

[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:

[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

Merci d'avoir partagé. Je vais essayer ça. Nous constatons également une énorme quantité de plantages concernant ce problème.

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:

[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

certains héros ne portent pas de cape

@rmarinho @samhouts pouvons-nous rouvrir ce bogue? J'ai réussi à répliquer à nouveau en utilisant une version ajustée de l'exemple voir ci-dessus et il semble que plus de gens rencontrent le problème.

J'ai le même problème même avec les derniers formulaires. Pas de shell, pas d'en-têtes ou de pieds de page.

J'ai le même problème, mais avec un ListView sur iPad exécutant iOS 12.4.8 et un iPhone exécutant iOS 12.4.1, mais pas sur les appareils sous iOS 13. Je suis sur Xamarin Forms 4.7 SR5 ciblant 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

Des solutions de contournement pour ListView?

@ rd09 ListView n'utilise pas de GroupableItemsViewController. Vous êtes sûr de ne pas utiliser de CollectionView?

@ rd09 ListView n'utilise pas de GroupableItemsViewController. Vous êtes sûr de ne pas utiliser de CollectionView?

Merci pour la mise en garde, vous avez raison. J'ai en quelque sorte supposé cela, mais après avoir parcouru le code source et vérifié, j'ai décidé d'appliquer la solution de contournement publiée par @ l0gaw et cela a fonctionné.

L' utilisation de la solution de contournement

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

Nous voyons également cela sur iOS 12 uniquement et n'avons pas encore trouvé de solution de contournement.

J'ai aussi ce bug sur iPad

  • XAMARIN 4.7
  • iOS 13.5.1

SIGABRT: Impossible d'accéder à un objet supprimé.

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)

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:

[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

@ l0gaw Dois-je implémenter uniquement CustomRenderer dans le projet iOS ou ai-je besoin de quelque chose d'autre dans le projet principal?

@matheuscschenfeld Dans le projet iOS

Toujours en train de rencontrer ce problème, la solution de contournement ne résout pas ce problème

Éditer
J'ai résolu mon problème. Je faisais une liaison à une commande modèle au lieu de la commande viewmodel. Cette liaison n'était pas mise à jour lors du basculement entre les modèles de vue. Ainsi, au lieu de rejeter un élément de collection sur la nouvelle source de viewmodel, il souhaitait supprimer un élément de la collection qui était déjà supprimé.
Ne plus avoir de problème lors de la modification de la liaison vers le modèle de vue au lieu du modèle.

Vous devez être prudent en utilisant la solution de contournement qui a été publiée car la ligne qui définit SelectedItem sur null déclenche l'événement SelectedItem, donc si vous avez une liaison bidirectionnelle définie sur cette propriété et que vous ne vérifiez pas null, cela provoquera une exception. J'ai complètement supprimé la ligne car je ne pense pas que ce soit nécessaire pour la solution de contournement.

@samhouts Toute mise à jour

Je suppose que cela peut être corrigé sur Xamarin.Forms 5.x ou peut-être attendre jusqu'à MAUI. J'espère me tromper

Je reproduis également ce problème sur Xamarin 4.8 sur le simulateur iOS

@samhouts @hartez Beaucoup de gens signalent encore ce bug assez important. La portée de ce bogue était trop petite pour résumer le problème réel.

C'est assez impressionnant, ce n'est pas encore corrigé, j'ai aussi ce bug, le CollectionView n'a jamais fonctionné correctement sur iOS

La solution de contournement de @ l0gaw fonctionnait auparavant, mais maintenant elle ne fonctionne plus. Je ne peux pas dire s'il s'agit de la dernière mise à jour iOS, ou non, mais cela devient vraiment ennuyeux - se bloque partout à partir d'une simple mise à jour / effacement.

@mduchev Je vois cela aussi. Cela se produit sur iOS 13 et 14. La seule chose qui a changé pour moi a été de passer à Xamarin.iOS 14. Essayer de voir si je peux trouver une solution de contournement maintenant.

Plus précisément, voici la pile que je vois maintenant:

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)

Après avoir publié la solution de contournement suggérée, je vois maintenant cette exception dans App Center: System.IndexOutOfRangeException: IItemsViewSource est vide

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

Supprimez-vous un élément de la collection? Si tel est le cas, vous avez peut-être rencontré un autre problème signalé (que je rencontre également constamment) - https://github.com/xamarin/Xamarin.Forms/issues/9632. Sinon, je suppose que, comme je l'ai dit ci-dessus, la solution de contournement ne fonctionne pas dans tous les cas, malheureusement.

J'ai pu recréer le dernier numéro que j'ai publié. Lorsque je navigue vers un écran où j'ai un CollectionView et que je le modifie en ajoutant ou en supprimant un élément, puis en fermant l'écran, cette exception est levée. Si je vais au même écran et ne modifie pas la CollectionView, puis quitte l'écran, l'exception n'est pas levée. La solution de contournement fonctionne toujours pour moi, cependant, j'ai dû refactoriser certaines zones car l'effacement de CollectionView plantera. Ainsi, la solution de contournement introduira certainement de nouveaux problèmes. Je pense que le pari le plus sûr à ce stade est de ne pas utiliser CollectionViews.

J'ai le même problème.
Le scénario est

  • Créer une vue carrousel
  • Utiliser collectionview à l'intérieur du modèle carrouselview
  • Par exemple, cliquez sur les éléments de carrousel et les éléments de collection; faire changer les états - cliecked
  • Essayez de mettre à jour une partie xaml et vérifiez si la vue est mise à jour via le rechargement à chaud
  • Cliquez sur carrouselview - collectionvoir à nouveau les éléments

Au point, l'erreur jette sur mon expérience.

  • Cela se produit en mode débogage avec le simulateur iOS
  • Mais je n'ai pas pu le reproduire sur l'appareil iPhone déployé avec le mode de libération.
  • L'erreur est le cas uniquement en mode débogage pour moi.

Ce serait beaucoup plus facile à résoudre si quelqu'un pouvait fournir un exemple de projet avec les derniers packages Xamarin. Je n'arrive pas à identifier le cas exact lorsque cela se produit constamment. Si quelqu'un le peut, veuillez fournir un projet de démonstration décrivant le problème afin qu'il puisse être résolu rapidement.

@mduchev Avez-vous vu ce commentaire de @ daves1992?

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

Il suffit de demander car il est un peu enfoui dans le flot de commentaires. Cela ne reproduit-il pas le problème pour vous?

@lafritay Malheureusement, non. Je suis capable de lancer le projet sur un simulateur et un appareil sans aucun problème. La navigation entre les pages ne semble pas non plus déclencher l'exception.

@lafritay Malheureusement, non. Je suis capable de lancer le projet sur un simulateur et un appareil sans aucun problème. La navigation entre les pages ne semble pas non plus déclencher l'exception.

Quelle version d'IOS?

J'ai réussi à le répliquer sur 12.4.1 mais je ne pense pas qu'il ait été répliqué sur les versions ultérieures.

Ce serait beaucoup plus facile à résoudre si quelqu'un pouvait fournir un exemple de projet avec les derniers packages Xamarin. Je n'arrive pas à identifier le cas exact lorsque cela se produit constamment. Si quelqu'un le peut, veuillez fournir un projet de démonstration décrivant le problème afin qu'il puisse être résolu rapidement.

Vous devez être sur iOS 12 pour recréer.

@ rd09 Pas vrai. Je voyais la même erreur sur les appareils iOS 13 et maintenant je la vois à nouveau sur les appareils iOS 14. Malheureusement, les exemples de projets ne semblent pas recréer le problème, donc je suppose qu'il persiste sous une autre forme.

repro + solution: https://github.com/xamarin/Xamarin.Forms/issues/11853

aucune solution de contournement.

@mduchev @ rd09 J'ai pu obtenir une simple repro:

Bugs.zip

Une fois que vous avez chargé l'application, attendez que les éléments se chargent. Ensuite, procédez comme suit:

  1. Accédez à la page À propos à l'aide du menu
  2. Revenez à la page des éléments (elle doit être vide)
  3. Utilisez "tirer pour actualiser" pour actualiser la page. L'exception devrait se produire lorsque les éléments ont fini de se charger.

La clé pour y arriver est cette ligne dans ItemsPage.xaml.cs

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

Le problème est que si CollectionView.ItemsSource est mis à jour, le ItemsViewSource qui contient la valeur d'origine n'est jamais supprimé. Ainsi, il conserve son gestionnaire CollectionChanged et réagit aux changements. Si la collection est ensuite mise à jour après s'être éloignée de la page (par exemple, à cause d'un appel réseau lent), le mauvais ItemsViewSource accède au ItemsViewController supprimé.

Je crois que le problème est la méthode UpdateItemsSource dans ce fichier: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . Il ne dispose pas de la valeur détenue par ItemsSource bien qu'il semble posséder la durée de vie de l'objet.

Cela semble être confirmé par le fait que son homologue Android dispose de l'objet (voir UpdateItemsSource dans ce fichier: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Platform.Android / CollectionView / ItemsViewAdapter.cs)

Et, je pense que l'une des principales raisons pour lesquelles cela continue de se produire est que la solution de contournement selon laquelle de nombreuses personnes utilisent des nulls hors de la ItemsSource lorsque dispose est appelée.

@lafritay J'utilise cette solution de contournement qui semble fonctionner dans de courts tests. Cela ne résout pas entièrement la mise au rebut lorsque la source de collecte est modifiée, mais évite les plantages que j'ai eu

''
using Example.Controls;
en utilisant Example.iOS.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer (typeof (ExtendedCollectionView), typeof (ExtendedCollectionViewRender))]
namespace Example.iOS.Renderers
{
classe publique ExtendedCollectionViewRender: CollectionViewRenderer
{
protection de remplacement GroupableItemsViewControllerCreateController (GroupableItemsView itemsView, disposition ItemsViewLayout)
{
retourne un nouveau CustomGroupableItemsViewController(itemsView, mise en page);
}
}
}

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

namespace Example.iOS.Renderers
{
classe publique CustomGroupableItemsViewController: GroupableItemsViewController
où TItemsView: GroupableItemsView
{
public CustomGroupableItemsViewController (TItemsView selectableItemsView, disposition ItemsViewLayout): base (selectableItemsView, disposition)
{
}

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

}

en utilisant le système;
en utilisant Foundation;
using Xamarin.Forms.Platform.iOS;

namespace Example.iOS.Renderers
{
classe interne 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 Voici ma solution de contournement complète:

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

J'ai trouvé une solution de contournement pour ce bogue. Je crée un moteur de rendu personnalisé pour Collectionview et j'écrase la méthode Dispose.
Voici le code du moteur de rendu personnalisé:
[assembly: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
espace de noms Project.iOS.Renderers
{
classe publique CustomCollectionViewRenderer: CollectionViewRenderer
{
protected override void Dispose (suppression des booléens)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (élimination);
}
}
}

@ l0gaw Dois-je implémenter uniquement CustomRenderer dans le projet iOS ou ai-je besoin de quelque chose d'autre dans le projet principal?

Cette solution de contournement a fonctionné dans mon cas. J'ai également supprimé la ligne "ItemsView.SelectedItem = null" car elle n'est pas nécessaire dans mon cas, tout comme ce que @ rd09 a dit.

même problème avec moi, une solution ou une solution de contournement? ... c'est la trace de la pile ...
J'utilise la dernière version stable des formulaires xamarin
en utilisant AppShell
se produit dans iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (taille CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (taille CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(wrapper géré en natif) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] args, principal System.IntPtr, délégué System.IntPtr)
UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho J'ai réussi à le reproduire en changeant légèrement l'échantillon.

J'ai ajouté un délai de 100 ms pour définir la propriété Items.

iphone 6
IOS 12.4.5
Xamarin.Forms 4.8

Cette repro ne plante plus à partir du 4.8.0.1364.

@mduchev @ rd09 J'ai pu obtenir une simple repro:

Bugs.zip

Cette repro ne lève plus l'exception ObjectDisposedException dans la version 5.0.0-pre3.

même problème avec moi, une solution ou une solution de contournement? ... c'est la trace de la pile ...
J'utilise la dernière version stable des formulaires xamarin

@ahmedroshdy Vous voyez cela à l'aide de Xamarin.Forms 4.8.0.1560?

Cette page vous a été utile?
0 / 5 - 0 notes