Xamarin.forms: [Bug] [iOS] Tidak dapat mengakses objek yang dibuang. Nama objek: 'GroupableItemsViewController`1

Dibuat pada 30 Okt 2019  ·  91Komentar  ·  Sumber: xamarin/Xamarin.Forms

Deskripsi

Tampilan koleksi dengan tajuk menyebabkan error setelah menavigasi melalui flyout shell.
Bug ini hanya untuk iOS. Di Android itu berfungsi dengan baik.

Aplikasi tidak akan mogok jika Anda menggunakan tab.

Langkah-langkah untuk Mereproduksi

  1. Buka Aplikasi
  2. Gunakan shell flyout untuk menavigasi ke Halaman 2
  3. Gunakan shell flyout untuk menavigasi kembali ke Halaman 1

-> Aplikasi akan macet

Perilaku yang Diharapkan

Tidak menabrak.

Perilaku Sebenarnya

Melempar:

System.ObjectDisposedException: 'Tidak dapat mengakses objek yang dibuang.
Nama objek: 'GroupableItemsViewController`1'. '
dan crash.

Informasi dasar

  • Versi dengan masalah: 4.3.0.947036, 4.3.0.908675, ..., 4.4.0.991265
  • Versi bagus terakhir yang diketahui: 4.2.0.910310
  • IDE: Visual Studio 2019
  • Kerangka Kerja Target Platform:

    • iOS: 13.1, 13.2 (Mungkin versi lain juga)

Tautan Reproduksi

BugExample.zip

collectionview high high impact iOS 🍎 bug

Komentar yang paling membantu

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:

[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

Semua 91 komentar

Ada ide untuk mengatasinya?

Perilaku yang sama dengan TabBar . Apakah ada investigasi yang sedang berlangsung?

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>

Debug Log

[UICollectionView] Pembaruan tidak valid: jumlah item tidak valid di bagian 0. Jumlah item yang terdapat di bagian yang ada setelah pembaruan (1) harus sama dengan jumlah item yang ada di bagian itu sebelum pembaruan (1), plus atau dikurangi jumlah item yang disisipkan atau dihapus dari bagian itu (1 disisipkan, 0 dihapus) dan plus atau minus jumlah item yang dipindahkan masuk atau keluar dari bagian itu (0 pindah masuk, 0 pindah keluar). - akan melakukan reloadData. Contoh UICollectionView:; lapisan =; contentOffset: {0, -100}; contentSize: {414, 45}; adjustedContentInset: {100, 0, 0, 0}; tata letak:; sumber data:>; currentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: tua:baruitem: <(
"I (0,0)"
)>]

Pesan Pengecualian

Tidak dapat mengakses objek yang dibuang.
Nama objek: GroupableItemsViewController

Saya baru saja mendapatkan kesalahan yang sama ini dari revisi aplikasi yang tidak berfungsi yang telah keluar selama sebulan.

Terjadi di iOS 12.4.1. Laporan dari AppCenter, jadi detailnya terbatas dan saya belum dapat mereproduksinya. Kebanyakan orang sepertinya tidak pernah menemukannya.

@BioTurboNick versi Formulir Xamarin mana yang Anda gunakan? Karena masalah Anda terlihat seperti hal lain.
Kesalahan di atas cukup mudah terjadi dan akan terjadi setiap kali Anda beralih antar halaman.

Hmm mungkin begitu. Saya menggunakan 4.2.0.848062. Namun, saya belum pernah melihat ObjectDisposedException dari GroupableItemsViewController sebelumnya.

Saya menguji bug ini di 4.2.0.9 ... dan berfungsi dengan baik. Mungkinkah ini sesuatu yang lain?

Mengenai Versi XF SDK: 4.3.0.947036 (stabil terbaru)

Saya mengajukan masalah baru karena terkait tetapi terjadi di TabBar: https://github.com/xamarin/Xamarin.Forms/issues/8394

masalah yang sama datang tetapi tanpa pengelompokan. dalam bentuk versi 4.3

Saya mengalami masalah dengan tampilan koleksi dengan footer. Menghapus footer tampaknya telah menyelesaikan masalah.

Masih mendapatkan masalah ini di 4.4.0.991265 Saya tidak memiliki header atau footer di CollectionView saya dan masih macet.

Untitled

Saya mendapatkan bug ini dengan tampilan koleksi (menurut saya) sederhana, saya menggunakan Formulir Xamarin 4.4.0.991265, dengan tampilan daftar berfungsi dengan baik

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

Ini membuat pertama kali tetapi ketika saya melakukan 'hot reload' itu rusak dengan:

System.ObjectDisposedException: Tidak dapat mengakses objek yang dibuang.
Nama objek: '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] di / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / eksternal / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 263
di 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 (indeks System.Int32, item T) [0x0001a] di / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / eksternal / mono / eksternal / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 196
di System.Collections.ObjectModel.Collection`1 [T] .Add (T item) [0x00020] di / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Umum / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
di O.ViewModels.CashSummaryViewModel.ExviationLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] di /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019

Setelah memperbarui ke 4.4.0.991265, saya mengalami ini lagi - bahkan pada tampilan koleksi tanpa header atau footer. :(

Harap segera perbaiki ini. Saya juga memiliki masalah ini. Tidak dapat menggunakan cangkang dalam produksi karena itu. Harus ditandai kritis.

Langkah-langkah untuk Mereproduksi
Buka Aplikasi
Gunakan shell flyout untuk menavigasi ke Halaman 2
Gunakan shell flyout untuk menavigasi kembali ke Halaman 1
-> Aplikasi akan macet

Permasalahan yang sama. Mengapa ini belum diperbaiki?

@Jsiemens apa yang dikatakan 👆

Saya juga menghadapi masalah ini dalam tampilan koleksi dengan atau tanpa header dan footer. Menggunakan Xamarin.Forms 4.4.0.991640

@artez Terima kasih. Ini adalah bug kritis yang membuat shell tidak dapat digunakan di iOS.

Saya memiliki masalah yang sama dan saya tidak dapat memublikasikan Aplikasi buggy .... Harap perbaiki!

Masalah yang sama di sini.

Masalah yang sama di sini

Masalah yang sama di 4.4.0.991640 tanpa shell, tanpa header, dan tanpa footer.

Juga terjadi menggunakan CarouselView yang saya bayangkan memiliki hal yang sama di bawah tenda

Ayolah, tim Xamarin ... Apakah benar-benar dapat diterima jika memiliki bug yang mogok dalam produksi selama 5 bulan?

@PureWeen @hartez @samhouts

Tidak pernah ada bug ini sebelum 4.5.
Setelah memperbarui ke 4,5 bug ini muncul di CollectionView (tanpa Shell).

Masalah yang sama di sini dengan Hot-Reload:
Dalam kasus saya, ListView

Pandangan:
`


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

`

ViewCell (Templat):
` xmlns: x = "http://schemas.microsoft.com/winfx/2009/xaml"
x: Kelas = "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>

`

Setiap kali saya mengubah sesuatu di Templat, tekan Simpan untuk memulai hot-reload, kesalahan terjadi (iOS 13 di dalam Simulator; iOS 12 pada Perangkat nyata)

Tidak terjadi dengan setiap Listview / Template dan saya tidak tahu apa perbedaannya atau bagaimana cara mengatasinya ... sampai sekarang ini hanya terjadi dengan Hot-Reload yang mengganggu tetapi tidak kritis - tetapi ketika saya membaca beberapa Anda memiliki ini pada runtime normal saya agak takut ...

Berikut ini Stack-Trace:

`Tidak dapat mengakses objek yang dibuang.
Nama objek: 'DefaultRenderer'.

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

saya juga memiliki masalah ini di aplikasi saya. menghapus footer dari tampilan koleksi di halaman yang sesuai dengan tampilan kotak tak terlihat dengan tinggi 100 (hanya untuk menambahkan beberapa ruang di bagian bawah tampilan) menyelesaikan masalah.
ada hal lain yang berfungsi dengan baik: saya memiliki beberapa definisi flyoutitem di halaman shell saya. jika saya hanya memiliki satu definisi flyoutitem, masalah ini tidak muncul. jadi jika Anda dapat merancang flyout shell Anda sehingga setiap konten shell ada dalam satu flyoutitem, masalahnya teratasi.

@Genfood pada proyek sampel Anda, masalahnya adalah header dari collectionview di ItemsPage. menghapusnya menyelesaikan masalah, tetapi seharusnya tidak crash dengan atau tanpa pengaturan header. Hal lain yang dapat Anda lakukan, seperti yang disebutkan di atas, adalah menggabungkan semua item flyout menjadi satu. maka itu akan berhasil juga.

bug buruk ini perlu diperbaiki

@samhouts Kapan perbaikan akan dirilis?

@samhouts Saya baru saja mencoba versi itu dan masalahnya masih berlanjut.

System.ObjectDisposedException
Pesan = Tidak dapat mengakses objek yang dibuang.
Nama objek: 'WkWebViewRenderer'.

Saya juga menghadapi masalah yang sama

@samhouts Ini tidak diperbaiki.

Saya mengujinya di 4.6 stable yang baru dirilis. Dan sepertinya sudah diperbaiki. 🎉
Setidaknya contoh bug yang saya lampirkan untuk masalah ini berfungsi sekarang.

@samhouts Sudah diperbaiki jika Anda memiliki CollectionView tetapi tidak jika Anda memiliki WebView. Itu masih rusak. Mungkin beberapa lainnya juga.

@samhouts Saya baru saja mencoba versi itu dan masalahnya masih berlanjut.

System.ObjectDisposedException
Pesan = Tidak dapat mengakses objek yang dibuang.
Nama objek: 'WkWebViewRenderer'.

@ g4mb10r Itu kesalahan yang berbeda dari kontrol yang berbeda dari masalah asli yang diposting. ObjectDisposedExceptions dapat disebabkan oleh banyak hal.

Silakan buka masalah baru dengan informasi Anda (bahwa ini adalah WkWebviewRenderer) dan harap sertakan info lain yang Anda miliki (jejak tumpukan, proyek repro jika memungkinkan).

@samhouts Saya masih mengalami masalah ini dengan CollectionViews di v1.6. Ini jejaknya:

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

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

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

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

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

di (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)

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

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

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

Saya tidak dapat menentukan dengan tepat hal yang menyebabkan masalah tetapi saya memiliki CollectionView di beberapa tab dalam flyoutitem menggunakan Shell. Setiap CollectionView menggunakan header grup.

Memuat tab dengan CollectionView baik-baik saja, lalu yang kedua juga baik-baik saja. Kemacetan terjadi saat saya mencoba menavigasi kembali ke tampilan sebelumnya.

Saya sedang berusaha mereplikasi ini dalam proyek sampel tetapi sejauh ini belum dapat melakukannya. Saya juga tidak mengalami masalah apa pun di Android.

EDIT

Saya telah membuka Masalah # 10953 baru karena sepertinya saya telah menemukan penyebabnya. Tidak yakin apakah itu terkait dengan Masalah poster asli.

Ini masih rusak di v4.7.0.1080 di iOS. Android baik-baik saja.

3x CollectionView pada 3x halaman berbeda, tanpa header atau footer. Tidak menggunakan Shell, hanya ContentPages biasa.

Hot-Reload atau tidak, tidak masalah. Populasi tampilan-koleksi pertama baik-baik saja. Menyegarkannya menyebabkan crash. Dan ini mungkin implementasi collectionview paling sederhana yang pernah ada.

Semuanya rusak dengan cara yang persis sama saat ObservableCollection yang mendasari dihapus dan diisi kembali.

Saya tidak percaya ini masih macet setelah hampir 9 bulan.

Jika itu membantu orang lain yang datang ke sini setelah ini ditutup-tetapi-tidak-diperbaiki, saya perhatikan bahwa jika saya memperkenalkan penundaan yang sangat singkat (> 100 md) antara membersihkan dan mengisi kembali itu tampaknya membantu. Saya bukan penggemar memperkenalkan penundaan untuk 'memperbaiki' banyak hal.

Jika Anda mencoba dan menghapusnya menggunakan metode yang berbeda, misalnya while observablecollection.count > 0 do observablecollection.removeat(0) (untuk menghapusnya) dan kemudian mencoba untuk mengisi kembali terlalu cepat, terkadang Anda akan mendapatkan pengecualian yang berbeda dari SemaphoreSlim:

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

Sama saja @wislon ☹️, yang dapat menambahkan yang mereproduksinya di iOS v12.4 tetapi di v13.5 bekerja tanpa putus asa

Memperbarui:

Dengan versi Xamarin.Forms 4.6.0.1180 bug ini tidak dapat direkonstruksi di iOS v12.4

Saya masih menjalankan ini dengan versi terbaru Xamarin.Forms menjalankan IOS 12.4.5

Saya dapat melakukan repro ini menjalankan iOS 12.4.1 (tetapi tidak 13.x) dan Xamarin.Forms 4.7. Silakan buka bug itu lagi.

@robintschroeder , @ daves1992 dapatkah Anda mereproduksi menggunakan BugExample?

@rmarinho Ya, baru saja menguji iPhone 6 yang menjalankan 12.4.5 dan dapat melakukan repro menggunakan BugExample untuk pertama kalinya

System.ObjectDisposedException: 'Tidak dapat mengakses objek yang dibuang.
Nama objek: 'GroupableItemsViewController`1'. '

Saya menguji dengan 4.8 di iOS 12.2 Simulator dan tampaknya berfungsi.

Saya buruk, saya lupa memperbarui Xamarin.Forms dalam sampel. Saya memperbarui ke 4.8 dan belum dapat mereproduksi pada sampel atau aplikasi saya sejak ... sakit awasi karena tidak repro setiap hari dan saya 100% pada 4.7.X

bug masih ada di xamarin 4.8 (iphone 6, ios 12.4.6)

@rkarban apakah Anda memiliki repo? saya baru saja menguji dan tidak dapat mereproduksinya.

@rmarinho sayangnya repo-nya bersifat pribadi, dan saya tidak dapat memberikan akses
di sini adalah jejak tumpukan
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (ukuran CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (ukuran CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] args, prinsip System.IntPtr, delegasi System.IntPtr)
UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho Saya berhasil menggandakannya dengan mengubah sedikit sampel.

Saya menambahkan penundaan 100ms untuk mengatur properti Item.

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

Saya memiliki masalah yang sama di ios 12 bahkan dengan Xamarin Forms 4.8. Collectionview mengalami error di perangkat ini. Kami perlu membuka kembali masalah ini.

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:

[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:

[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

Terima kasih telah berbagi. Saya akan mencoba ini. Kami juga melihat sejumlah besar error terkait masalah ini.

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:

[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

beberapa pahlawan tidak memakai jubah

@rmarinho @samhouts dapatkah kita membuka kembali bug ini? Saya berhasil mereplikasi lagi menggunakan versi yang disesuaikan dari contoh lihat di atas dan tampaknya lebih banyak orang mengalami masalah.

Saya juga mengalami masalah yang sama bahkan dengan Formulir terbaru. Tanpa Shell, tanpa Header atau Footer.

Saya mengalami masalah yang sama, tetapi dengan ListView di iPad yang menjalankan iOS 12.4.8 dan iPhone yang menjalankan iOS 12.4.1, tetapi tidak pada perangkat di iOS 13. Saya menggunakan Xamarin Forms 4.7 SR5 yang menargetkan 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

Ada solusi untuk ListView?

@ rd09 ListView tidak menggunakan GroupableItemsViewController. Anda yakin Anda tidak menggunakan CollectionView?

@ rd09 ListView tidak menggunakan GroupableItemsViewController. Anda yakin Anda tidak menggunakan CollectionView?

Terima kasih atas perhatiannya, Anda benar. Saya entah bagaimana berasumsi bahwa tetapi setelah melalui kode sumber dan memverifikasi, saya memutuskan untuk menerapkan solusi yang diposting oleh @ l0gaw dan berhasil.

Menggunakan solusi @ l0gaw memperbaiki kemogokan yang saya lihat sebelumnya, tetapi sekarang saya mendapatkan macet lain dengan pengecualian yang sama tetapi jejak tumpukan berbeda:

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

Kami juga melihat ini hanya di iOS 12, dan sejauh ini belum menemukan solusinya.

Saya memiliki bug ini juga di iPad

  • XAMARIN 4.7
  • iOS 13.5.1

SIGABRT: Tidak dapat mengakses objek yang dibuang.

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)

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:

[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

@ l0gaw Apakah saya hanya perlu menerapkan CustomRenderer di proyek iOS atau apakah saya memerlukan sesuatu yang lain di proyek utama?

@matheuscschenfeld Dalam proyek iOS

Juga masih mengalami masalah ini, solusi tidak memperbaiki ini

edit
Saya memperbaiki masalah saya. Saya melakukan pengikatan ke perintah model daripada perintah viewmodel. Pengikatan ini tidak diperbarui saat beralih bolak-balik antara model tampilan. Jadi, alih-alih menutup item koleksi pada sumber model tampilan baru, ia ingin menghapus item dari koleksi yang sudah dibuang.
Tidak mengalami masalah lagi saat mengubah pengikatan ke viewmodel, bukan model.

Anda harus berhati-hati menggunakan solusi yang telah diposting karena baris yang menetapkan SelectedItem ke null memicu Peristiwa SelectedItem, jadi jika Anda memiliki dua cara pengikatan yang ditetapkan ke properti itu dan tidak memeriksa null, itu akan menyebabkan pengecualian. Saya menghapus garis sepenuhnya karena menurut saya tidak perlu untuk mengatasinya.

@samhouts Setiap pembaruan tentang apakah ini akan diambil segera. Masalah yang sama juga terjadi di Listview. Bentuk versi 4.7.0.1080

Saya menduga ini mungkin diperbaiki pada Xamarin.Forms 5.x atau mungkin menunggu sampai MAUI. Saya berharap salah

Saya mereproduksi masalah ini juga di Xamarin 4.8 di simulator iOS

@samhouts @hartez Banyak orang masih melaporkan bug yang cukup besar ini. Cakupan bug ini terlalu kecil untuk merangkum masalah yang sebenarnya.

Cukup mengesankan ini belum diperbaiki, saya juga mengalami bug ini, CollectionView tidak pernah berfungsi dengan baik di iOS

Solusi @ l0gaw dulu berhasil, tapi sekarang tidak. Tidak tahu apakah itu dari pembaruan iOS terakhir, atau bukan, tetapi itu semakin menjengkelkan - macet di mana-mana dari pembaruan sederhana / jelas.

@mduchev Saya melihat ini juga. Ini terjadi pada iOS 13 dan 14. Satu-satunya hal yang berubah bagi saya adalah pindah ke Xamarin.iOS 14. Mencoba melihat apakah saya dapat menemukan solusi sekarang.

Secara khusus, inilah tumpukan yang saya lihat sekarang:

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)

Setelah memublikasikan solusi yang disarankan, saya sekarang melihat pengecualian ini di App Center: System.IndexOutOfRangeException: IItemsViewSource kosong

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

Apakah Anda menghapus item dari koleksi? Jika demikian, maka Anda mungkin telah mengalami masalah lain yang dilaporkan (yang juga terus-menerus saya bahas) - https://github.com/xamarin/Xamarin.Forms/issues/9632. Jika tidak, maka saya kira, seperti yang saya katakan di atas, sayangnya solusi tersebut tidak berfungsi di semua kasus.

Saya dapat membuat ulang masalah terakhir yang saya posting. Ketika saya menavigasi ke layar di mana saya memiliki CollectionView dan saya memodifikasinya dengan menambahkan atau menghapus item, kemudian menutup layar pengecualian ini dilemparkan. Jika saya pergi ke layar yang sama dan tidak memodifikasi CollectionView, maka keluar dari layar pengecualian tidak dilempar. Solusinya masih berfungsi untuk saya, meskipun, saya harus merefaktor beberapa area karena menghapus CollectionView akan macet. Jadi, solusi tersebut pasti akan memperkenalkan masalah baru. Saya pikir taruhan teraman saat ini adalah tidak menggunakan CollectionViews.

Saya memiliki masalah yang sama.
Skenario adalah

  • Buat carouselview
  • Gunakan collectionview di dalam template carouselview
  • Misalnya klik item carousel dan item koleksi; membuat mereka menyatakan berubah - klik
  • Coba perbarui beberapa bagian xaml dan periksa apakah tampilan diperbarui melalui hot reload
  • Klik carouselview - collectionview items lagi

Pada intinya, kesalahan terjadi pada pengalaman saya.

  • Itu terjadi pada mode debug dengan simulator ios
  • Tetapi saya tidak dapat mereproduksinya di perangkat iPhone yang digunakan dengan mode rilis.
  • Kesalahan hanya terjadi dalam mode debug bagi saya.

Akan jauh lebih mudah untuk memperbaikinya jika seseorang dapat memberikan proyek sampel dengan paket Xamarin terbaru. Sepertinya saya tidak dapat menunjukkan kasus yang tepat ketika ini terjadi terus-menerus. Jika ada yang bisa, berikan proyek demo yang mendeskripsikan masalah tersebut agar dapat diperbaiki dengan cepat.

@mduchev Apakah Anda melihat komentar ini dari @ daves1992?

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

Hanya bertanya karena agak tertimbun banjir komentar. Apakah itu tidak mereproduksi masalah untuk Anda?

@ lafritay Sayangnya, tidak. Saya dapat meluncurkan proyek pada simulator & perangkat tanpa masalah apa pun. Menavigasi antar halaman juga tampaknya tidak memicu pengecualian.

@ lafritay Sayangnya, tidak. Saya dapat meluncurkan proyek pada simulator & perangkat tanpa masalah apa pun. Menavigasi antar halaman juga tampaknya tidak memicu pengecualian.

Versi iOS yang mana?

Saya berhasil menirunya di 12.4.1 tetapi menurut saya tidak direplikasi di versi yang lebih baru.

Akan jauh lebih mudah untuk memperbaikinya jika seseorang dapat memberikan proyek sampel dengan paket Xamarin terbaru. Sepertinya saya tidak dapat menunjukkan kasus yang tepat ketika ini terjadi terus-menerus. Jika ada yang bisa, berikan proyek demo yang mendeskripsikan masalah tersebut agar dapat diperbaiki dengan cepat.

Anda harus menggunakan iOS 12 untuk membuat ulang.

@ rtk Tidak benar. Saya melihat kesalahan yang sama di perangkat iOS 13 dan sekarang saya melihatnya lagi di perangkat iOS 14. Sayangnya, proyek sampel tampaknya tidak menciptakan kembali masalah jadi saya kira itu masih bertahan dalam beberapa bentuk lain.

@mduchev @ rd09 Saya bisa mendapatkan repro sederhana:

Bugs.zip

Setelah Anda memuat aplikasi, tunggu item dimuat. Kemudian lakukan hal berikut:

  1. Arahkan ke halaman Tentang menggunakan menu
  2. Menavigasi kembali ke halaman item (harus kosong)
  3. Gunakan "tarik untuk menyegarkan" untuk menyegarkan halaman. Pengecualian harus terjadi ketika barang selesai dimuat.

Kunci untuk membuat ini terjadi adalah baris ini di ItemsPage.xaml.cs

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

Masalahnya adalah jika CollectionView.ItemsSource pernah diperbarui, ItemsViewSource yang berisi nilai asli tidak akan pernah dibuang. Jadi, ia mempertahankan penangan CollectionChanged dan bereaksi terhadap perubahan. Jika koleksi kemudian diperbarui setelah menavigasi keluar dari halaman (katakanlah, karena panggilan jaringan yang lambat), ItemsViewSource mengakses ItemsViewController dibuang.

Saya yakin masalahnya adalah metode UpdateItemsSource dalam file ini: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . Itu tidak membuang nilai yang dipegang oleh ItemsSource meskipun tampaknya itu memiliki masa pakai objek.

Ini tampaknya dikonfirmasi oleh fakta bahwa mitra Android-nya memang membuang objek tersebut (lihat UpdateItemsSource dalam file ini: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Platform.Android / CollectionView / ItemsViewAdapter.cs)

Dan, menurut saya salah satu alasan besar mengapa hal ini terus terjadi adalah karena solusi yang banyak orang menggunakan nulls dari ItemsSource saat pembuangan dipanggil.

@ lafritay Saya menggunakan solusi ini yang tampaknya bekerja dalam pengujian singkat. Ini tidak memperbaiki pembuangan sepenuhnya saat sumber pengumpulan diubah dengan benar, tetapi mencegah kerusakan yang saya alami

``
menggunakan Example.Controls;
menggunakan Example.iOS.Renderers;
menggunakan Xamarin.Forms;
menggunakan Xamarin.Forms.Platform.iOS;

[perakitan: ExportRenderer (typeof (ExtendedCollectionView), typeof (ExtendedCollectionViewRender))]
namespace Example.iOS.Renderers
{
kelas publik ExtendedCollectionViewRender: CollectionViewRenderer
{
dilindungi override GroupableItemsViewControllerCreateController (GroupableItemsView itemsView, layout ItemsViewLayout)
{
mengembalikan CustomGroupableItemsViewController baru(itemsView, layout);
}
}
}

menggunakan Xamarin.Forms;
menggunakan Xamarin.Forms.Platform.iOS;

namespace Example.iOS.Renderers
{
kelas publik CustomGroupableItemsViewController: GroupableItemsViewController
di mana TItemsView: GroupableItemsView
{
public CustomGroupableItemsViewController (TItemsView selectableItemsView, layout ItemsViewLayout): base (selectableItemsView, layout)
{
}

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

}

menggunakan Sistem;
menggunakan Foundation;
menggunakan Xamarin.Forms.Platform.iOS;

namespace Example.iOS.Renderers
{
kelas internal 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 Berikut solusi lengkap saya:

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

Saya menemukan solusi untuk bug ini. Saya membuat perender khusus untuk Collectionview dan saya mengganti metode Buang.
Berikut adalah kode perender khusus:
[perakitan: ExportRenderer (typeof (CollectionView), typeof (CustomCollectionViewRenderer))]
namespace Project.iOS.Renderers
{
kelas publik CustomCollectionViewRenderer: CollectionViewRenderer
{
dilindungi override void Buang (bool disposing)
{
base.ItemsView.SelectedItem = null;
base.ItemsView.ItemsSource = null;
base.Dispose (membuang);
}
}
}

@ l0gaw Apakah saya hanya perlu menerapkan CustomRenderer di proyek iOS atau apakah saya memerlukan sesuatu yang lain di proyek utama?

Solusi ini berhasil dalam kasus saya. Saya juga menghapus baris "ItemsView.SelectedItem = null" karena tidak diperlukan dalam kasus saya seperti yang dikatakan @ rd09 .

masalah yang sama terjadi pada saya, solusi atau solusi apa pun? ... ini adalah pelacakan tumpukan ...
saya menggunakan versi stabil terbaru dari formulir xamarin
menggunakan AppShell
terjadi di iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
ItemsViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (ukuran CoreGraphics.CGSize)
ItemsViewLayout.UpdateConstraints (ukuran CoreGraphics.CGSize)
ItemsViewLayout.InvalidateLayout ()
(wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr)
UIApplication.Main (System.String [] args, prinsip System.IntPtr, delegasi System.IntPtr)
UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@rmarinho Saya berhasil menggandakannya dengan mengubah sedikit sampel.

Saya menambahkan penundaan 100ms untuk mengatur properti Item.

iphone 6
IOS 12.4.5
Xamarin.Forms 4.8

Repro ini tidak lagi mogok sejak 4.8.0.1364.

@mduchev @ rd09 Saya bisa mendapatkan repro sederhana:

Bugs.zip

Repro ini tidak lagi menampilkan ObjectDisposedException di 5.0.0-pre3.

masalah yang sama terjadi pada saya, solusi atau solusi apa pun? ... ini adalah pelacakan tumpukan ...
saya menggunakan versi stabil terbaru dari formulir xamarin

@ahmedroshdy Anda melihat ini menggunakan Xamarin.Forms 4.8.0.1560?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat