Xamarin.forms: [خطأ] [iOS] لا يمكن الوصول إلى كائن تم التخلص منه. اسم الكائن: 'GroupableItemsViewController`1

تم إنشاؤها على ٣٠ أكتوبر ٢٠١٩  ·  91تعليقات  ·  مصدر: xamarin/Xamarin.Forms

وصف

يتسبب عرض المجموعة مع الرأس في حدوث عطل بعد التنقل عبر shell flyout.
الخطأ هو iOS فقط. على Android يعمل بشكل جيد.

لن يتعطل التطبيق إذا كنت تستخدم علامات التبويب.

خطوات التكاثر

  1. افتح التطبيق
  2. استخدم shell flyout للانتقال إلى الصفحة 2
  3. استخدم shell flyout للعودة إلى الصفحة 1

-> سوف يتعطل التطبيق

سلوك متوقع

لا تتحطم.

السلوك الفعلي

رميات:

System.ObjectDisposedException: 'لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: 'GroupableItemsViewController`1'. '
وتحطم.

معلومات اساسية

  • الإصدار الذي يحتوي على إصدار: 4.3.0.947036 ، 4.3.0.908675 ، ... ، 4.4.0.991265
  • آخر إصدار جيد معروف: 4.2.0.910310
  • IDE: Visual Studio 2019
  • الأطر المستهدفة للمنصة:

    • iOS: 13.1 ، 13.2 (ربما إصدارات أخرى أيضًا)

رابط الاستنساخ

BugExample.zip

collectionview high high impact iOS 🍎 bug

التعليق الأكثر فائدة

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:

[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

ال 91 كومينتر

اي افكار لحل؟

نفس السلوك مع TabBar . هل هناك أي تحقيق جاري؟

AppShell.xaml



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

سجل التصحيح

[UICollectionView] تحديث غير صالح: عدد غير صالح من العناصر في القسم 0. يجب أن يكون عدد العناصر الموجودة في القسم الحالي بعد التحديث (1) مساويًا لعدد العناصر الموجودة في هذا القسم قبل التحديث (1) ، بالإضافة إلى أو مطروحًا منه عدد العناصر المدرجة أو المحذوفة من هذا القسم (1 مدرج ، 0 محذوف) بالإضافة إلى أو ناقص عدد العناصر التي تم نقلها إلى هذا القسم أو خارجه (0 تم نقله للداخل ، 0 تم نقله للخارج). - سيتم تنفيذ إعادة تحميل البيانات. عرض المثال:؛ طبقة =؛ contentOffset: {0، -100} ؛ contentSize: {414، 45}؛ AdjustContentInset: {100، 0، 0، 0} ؛ نسق:؛ مصدر البيانات:> ؛ CurrentUpdate: [UICollectionViewUpdate - 0x7fe2e5e1
c620: قديم:جديدالعناصر: <(
"أنا (0،0)"
)>]

رسالة الاستثناء

لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: GroupableItemsViewController

لقد تلقيت للتو هذا الخطأ نفسه من مراجعة التطبيق التي تعمل بخلاف ذلك والتي تم إصدارها لمدة شهر.

حدث في iOS 12.4.1. تقرير من AppCenter ، لذا فإن التفاصيل محدودة ولم أتمكن من إعادة إنتاجها. يبدو أن معظم الناس لا يواجهونها أبدًا.

BioTurboNick ما هو إصدار نماذج Xamarin الذي تستخدمه؟ لأن مشكلتك تبدو وكأنها شيء آخر.
من السهل جدًا إعادة إنتاج الخطأ أعلاه وسيحدث في كل مرة تقوم فيها بالتبديل بين الصفحات.

حسنًا ، ربما. أنا على 4.2.0.848062. ومع ذلك ، لم أر أبدًا ObjectDisposedException من GroupableItemsViewController من قبل الآن ، على الإطلاق.

لقد اختبرت هذا الخطأ في 4.2.0.9 ... وعمل بشكل جيد. ربما هذا شيء آخر؟

بخصوص إصدار XF SDK: 4.3.0.947036 (أحدث إسطبل)

لقد قدمت مشكلة جديدة لأنها مرتبطة ولكنها تحدث على TabBar: https://github.com/xamarin/Xamarin.Forms/issues/8394

تأتي نفس المشكلة ولكن بدون تجميع. في النماذج الإصدار 4.3

واجهت مشكلة مع عرض مجموعة مع تذييل. يبدو أن إزالة التذييل قد أدى إلى حل المشكلة.

ما زلت أتلقى هذه المشكلة في 4.4.0.991265 ليس لدي رأس أو تذييل في CollectionView ولا يزال يتعطل.

Untitled

أحصل على هذا الخطأ من خلال عرض مجموعة بسيط (على ما أعتقد) ، أنا أستخدم Xamarin Forms 4.4.0.991265 ، مع عرض القائمة يعمل بشكل جيد

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

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

                                    />
                        </Grid>

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

يتم عرضه في المرة الأولى ولكن عندما أقوم بـ "إعادة التحميل السريع" ، فإنه يتقطع مع:

System.ObjectDisposedException: لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: 'GroupableItemsViewController 1'. at Foundation.NSObject.get_SuperHandle () [0x00012] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.2.0.42/src/Xamarin.iOS/Foundation/NSObject2.cs:449 at UIKit.UIViewController.get_IsViewLoaded () [0x00023] in /Library/Frameworks/Xamarin.iOS.framework/Versions/13.2.0.42/src/Xamarin.iOS/UIViewController.g.cs:2075 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.NotLoadedYet () [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:142 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.Add (System.Collections.Specialized.NotifyCollectionChangedEventArgs args) [0x0000d] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:147 at Xamarin.Forms.Platform.iOS.ObservableItemsSource.CollectionChanged (System.Object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs args) [0x00023] in D:\a\1\s\Xamarin.Forms.Platform.iOS\CollectionView\ObservableItemsSource.cs:100 at (wrapper delegate-invoke) <Module>.invoke_void_object_NotifyCollectionChangedEventArgs(object,System.Collections.Specialized.NotifyCollectionChangedEventArgs) at System.Collections.ObjectModel.ObservableCollection 1 [T] .OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x00018] في / Users / builder / jenkins / workspace / xamarin-macios / xamarin / macios أحادي / خارجي / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 263
في System.Collections.ObjectModel.ObservableCollection 1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Users/builder/jenkins/workspace/xamarin-macios/xamarin-macios/external/mono/external/corefx/src/System.ObjectModel/src/System/Collections/ObjectModel/ObservableCollection.cs:338 at System.Collections.ObjectModel.ObservableCollection 1 [T] .InsertItem (System.Int32 index، T item) [0x0001a] في / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / خارجي / أحادي / خارجي / corefx / src / System.ObjectModel / src / System / Collections / ObjectModel / ObservableCollection.cs: 196
في System.Collections.ObjectModel.Collection`1 [T]. أضف (عنصر T) [0x00020] في / Users / builder / jenkins / workspace / xamarin-macios / xamarin-macios / external / mono / external / corefx / src / Common / src / CoreLib / System / Collections / ObjectModel / Collection.cs: 71
في O.ViewModels.CashSummaryViewModel.Ex BBQLoadItemsCommand (System.Boolean ForceRefresh) [0x00103] في /Users/chris/Projects/O/ViewModels/CashSummaryViewModel.cs:43
2019

بعد التحديث إلى 4.4.0.991265 ، أعود إلى هذا مرة أخرى - حتى في طرق عرض المجموعة بدون رؤوس أو تذييلات. :(

الرجاء إصلاح هذا على وجه السرعة. ولدي أيضا هذه المسألة. لا يمكن استخدام القشرة في الإنتاج بسبب ذلك. يجب وضع علامة حرجة.

خطوات التكاثر
افتح التطبيق
استخدم shell flyout للانتقال إلى الصفحة 2
استخدم shell flyout للعودة إلى الصفحة 1
-> سوف يتعطل التطبيق

نفس المشكلة. لماذا لم يتم إصلاح هذا بعد؟

ماjsiemens قال 👆

أواجه هذه المشكلة أيضًا في عرض المجموعة مع أو بدون رأس وتذييل. باستخدام Xamarin.Forms 4.4.0.991640

@ هارتز شكرا. هذا خطأ فادح يجعل shell غير قابل للاستخدام على iOS.

لدي نفس المشكلة ولا يمكنني نشر تطبيق عربات التي تجرها الدواب .... يرجى إصلاحها!

نفس المشكلة هنا.

نفس المشكلة هنا

نفس المشكلة في 4.4.0.991640 بدون غلاف وبدون رأس وبدون تذييل.

يحدث أيضًا باستخدام CarouselView الذي أتخيل أنه يحتوي على نفس الأشياء تحت الغطاء

تعال ، فريق Xamarin ... هل من المقبول حقًا وجود خلل في الإنتاج لمدة 5 أشهر؟

PureWeenhartezsamhouts

لم يكن لديه هذا الخطأ قبل 4.5.
بعد التحديث إلى 4.5 ، يظهر هذا الخطأ في CollectionView (بدون Shell).

نفس المشكلة هنا مع Hot-Reload:
في حالتي على ListView

المنظر:
"


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

"

ViewCell (النموذج):
" xmlns: x = "http://schemas.microsoft.com/winfx/2009/xaml"
x: Class = "DATAflor.Team.DFViews.Urlaub.CustomCells.AbwesenheitCell">

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

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

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

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

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


        </StackLayout>



    </StackLayout>
</ViewCell.View>

"

عندما أقوم بتغيير شيء ما في القالب ، اضغط على حفظ لبدء إعادة التحميل السريع ، يحدث الخطأ (iOS 13 داخل Simulator ؛ iOS 12 على جهاز حقيقي)

لا يحدث مع كل Listview / Template ولا أعرف ما هو الاختلاف أو كيفية حله ... حتى الآن لا يحدث هذا إلا مع Hot-Reload وهو أمر مزعج ولكنه ليس حرجًا - ولكن عندما قرأت ذلك بعضًا من لديك هذا في وقت التشغيل العادي ، أنا خائف قليلاً ...

هنا Stack-Trace:

`لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: "DefaultRenderer".

في Foundation.NSObject.get_SuperHandle () [0x00012] في /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/Foundation/NSObject2.cs:449
في UIKit.UIView.set_Frame (قيمة CoreGraphics.CGRect) [0x00024] في /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src/Xamarin.iOS/UIView.g.cs:3684
في Xamarin.Forms.Platform.iOS.ViewCellRenderer + ViewTableCell.LayoutSubviews () [0x000a5] في D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ ViewCellRenderer.cs: 103
في (برنامج التجميع المُدار إلى أصلي) ObjCRuntime.Messaging.void_objc_msgSend_IntPtr_Int64 (intptr ، intptr ، intptr ، long)
في UIKit.UITableView.ReloadRows (Foundation.NSIndexPath [] atIndexPaths، UIKit.UITableViewRowAnimation withRowAnimation) [0x0002a] في /Library/Frameworks/Xamarin.iOS.framework/Versions/13.8.3.0/src. CS: 824
في Xamarin.Forms.Platform.iOS.CellRenderer + <> c__DisplayClass8_0.b__0 (مرسل System.Object ، System.EventArgs e) [0x00032] في D: \ a \ 1 \ s \ Xamarin.Forms.Platform.iOS \ Cells \ CellRenderer.cs: 106
في Xamarin.Forms.Cell.OnForceUpdateSizeRequested () [0x00076] في D: \ a \ 1 \ s \ Xamarin.Forms.Core \ Cells \ Cell.cs: 234 '

لدي أيضًا هذه المشكلة في تطبيقي. تؤدي إزالة تذييل عرض المجموعة في الصفحة المقابلة مع عرض مربع غير مرئي بارتفاع 100 (فقط لإضافة بعض المساحة أسفل العرض) إلى حل المشكلة.
هناك شيء آخر يعمل بشكل جيد: لدي تعريفات متعددة لـ flyoutem في صفحة shell الخاصة بي. إذا كان لدي تعريف عنصر flyoutem واحد فقط ، فلن تظهر هذه المشكلة. لذلك إذا تمكنت من تصميم غلاف shell flyout بحيث يكون كل محتوى shell في عنصر flyoutem واحد ، فسيتم حل المشكلة.

Genfood في

هذا الخطأ الشرير يحتاج إلى الإصلاح

samhouts متى سيصدر الإصلاح؟

samhouts لقد جربت للتو هذا الإصدار وما زالت المشكلة قائمة.

System.ObjectDisposedException
الرسالة = لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: "WkWebViewRenderer".

أنا أيضا أواجه نفس المشكلة

samhouts لم يتم إصلاح هذا.

لقد اختبرت ذلك في الإصدار 4.6 المستقر الذي تم إصداره حديثًا. ويبدو أنه تم إصلاحه. 🎉
على الأقل مثال الخطأ الذي أرفقته بهذه المشكلة يعمل الآن.

samhouts يتم إصلاحه إذا كان لديك CollectionView ولكن ليس إذا كان لديك WebView. لا يزال ذلك مكسورًا. ربما البعض الآخر أيضا.

samhouts لقد جربت للتو هذا الإصدار وما زالت المشكلة قائمة.

System.ObjectDisposedException
الرسالة = لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: "WkWebViewRenderer".

@ g4mb10r هذا خطأ مختلف عن عنصر تحكم مختلف عن الإصدار الأصلي المنشور. يمكن أن يكون لـ ObjectDisposedExceptions العديد من الأسباب.

يرجى فتح مشكلة جديدة بمعلوماتك (أنها WkWebviewRenderer) ويرجى تضمين أي معلومات أخرى لديك (تتبع المكدس ، مشروع repro إن أمكن).

samhouts ما زلت أواجه هذه المشكلة مع CollectionViews في v1.6. هنا هو الأثر:

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

في UIKit.UIView.set_Frame (قيمة CoreGraphics.CGRect) [0x00024] في /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS/UIView.g.cs:3685

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

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

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

في (برنامج التضمين مُدار إلى أصلي) UIKit.UIApplication.UIApplicationMain (int ، سلسلة [] ، intptr ، intptr)

في UIKit.UIApplication.Main (System.String [] args ، System.IntPtr الرئيسي ، System.IntPtr مفوض) [0x00005] في /Library/Frameworks/Xamarin.iOS.framework/Versions/13.18.2.1/src/Xamarin.iOS /UIKit/UIApplication.cs:86

في UIKit.UIApplication.Main (System.String [] args، System.String basicClassName، System.String DelegateClassName) [0x0000e] في /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] في C: \ Code \ Logbook \ Logbook \ Logbook.iOS \ Main.cs: 17

لم أتمكن من تحديد الشيء الدقيق الذي يسبب المشكلة ولكن لدي CollectionViews في العديد من علامات التبويب داخل flyoutitem باستخدام Shell. يستخدم كل CollectionView رؤوس المجموعة.

يعد تحميل علامة تبويب باستخدام CollectionView أمرًا جيدًا ، ثم يعد تحميل علامة تبويب ثانية جيدًا. يحدث الانهيار عندما أحاول العودة إلى ما سبق عرضه.

أنا أعمل على محاولة تكرار هذا في نموذج مشروع ولكني لم أتمكن من ذلك حتى الآن. كما أنني لا أواجه أي مشكلات على Android.

تعديل

لقد فتحت إصدارًا جديدًا # 10953 حيث يبدو أنني وجدت السبب. لست متأكدًا مما إذا كان متعلقًا بمشكلة الملصق الأصلي.

لا يزال هذا مكسورًا في v4.7.0.1080 على iOS. Android جيد.

3x CollectionViews على 3x صفحات مختلفة ، بدون رؤوس أو تذييلات. عدم استخدام Shell ، فقط صفحات المحتوى العادية.

Hot-Reload or Not، لا يهم. مجتمع عرض المجموعة الأول جيد. تحديثه يسبب الانهيار. وربما يكون هذا هو أبسط تطبيق موجود لعرض المجموعة.

تنكسر جميعها بنفس الطريقة تمامًا عندما يتم مسح مجموعة ObservableCollection الأساسية ثم إعادة تسكينها.

لا أصدق أن هذا لا يزال ممتلئًا بعد ما يقرب من 9 أشهر.

إذا كان ذلك يساعد أي شخص آخر يأتي إلى هنا بعد أن يكون هذا مغلقًا ولكن لم يتم إصلاحه ، فقد لاحظت أنه إذا قمت بتقديم تأخير قصير جدًا (> 100 مللي ثانية) بين المقاصة وإعادة الإسكان ، يبدو أنه يساعد. لست من المعجبين بإدخال التأخيرات "لإصلاح" الأشياء.

إذا حاولت مسحها باستخدام طريقة مختلفة ، على سبيل المثال while observablecollection.count > 0 do observablecollection.removeat(0) (لمسحه) ثم حاولت إعادة الإسكان بسرعة كبيرة ، فستحصل أحيانًا على استثناء مختلف من SemaphoreSlim:

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

فقط نفس wislon ☹️ ، الذي يمكنه إضافة ذلك يعيد إنتاجه في iOS v12.4 لكن في v13.5 يعمل بدون سحق

تحديث:

مع الإصدار Xamarin.Forms 4.6.0.1180 هذا الخطأ غير قابل للتكرار في iOS v12.4

ما زلت أحصل على هذا الإصدار الأخير من Xamarin.Forms الذي يعمل بنظام IOS 12.4.5

يمكنني إعادة نسخ هذا الذي يعمل بنظام التشغيل iOS 12.4.1 (ولكن ليس 13.x) و Xamarin.Forms 4.7. الرجاء فتح الخطأ مرة أخرى.

robintschroeder ، @ daves1992 هل يمكنك إعادة الإنتاج باستخدام نموذج BugExample؟

rmarinho نعم ، تم اختباره للتو على Iphone 6 يعمل بإصدار 12.4.5 وتمكن من إعادة المحاولة باستخدام BugExample لأول مرة

System.ObjectDisposedException: 'لا يمكن الوصول إلى كائن تم التخلص منه.
اسم الكائن: 'GroupableItemsViewController`1'. '

لقد اختبرت مع 4.8 على iOS 12.2 Simulator ويبدو أنه يعمل.

لقد نسيت أن أقوم بتحديث Xamarin.Forms في العينة. لقد قمت بالتحديث إلى 4.8 ولم أتمكن من إعادة الإنتاج على العينة أو تطبيقي منذ ذلك الحين ... لم أراقب العين لأنه لم يعاد عرضه في كل مرة في اليوم الآخر وكنت 100٪ على 4.7.X

لا يزال الخطأ موجودًا على xamarin 4.8 (iphone 6، ios 12.4.6)

rkarban هل لديك الريبو؟ لقد اختبرت للتو ولم أتمكن من إعادة إنتاجها.

rmarinho للأسف ، الريبو خاص ، ولا يمكنني منح حق الوصول
هنا تتبع المكدس
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
العناصر ViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (CoreGraphics.CGSize الحجم)
العناصر ViewLayout.UpdateConstraints (CoreGraphics.CGSize Size)
ItemsViewLayout.InvalidateLayout ()
(تم إدارة برنامج التضمين إلى أصلي) UIKit.UIApplication.UIApplicationMain (int ، سلسلة [] ، intptr ، intptr)
UIApplication.Main (System.String [] args ، System.IntPtr الأساسي ، System.IntPtr المفوض)
UIApplication.Main (System.String [] args ، System.String mainClassName ، System.String DelegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@ rmarinho تمكنت من تكرارها عن طريق تغيير العينة قليلاً.

أضفت تأخيرًا قدره 100 مللي ثانية لتعيين خاصية العناصر.

أيفون 6
iOS 12.4.5
Xamarin الأشكال 4.8

    ObservableCollection<string> items;

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

    public Command LoadItemsCommand { get; set; }

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

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

لدي نفس المشكلة على ios 12 حتى مع Xamarin Forms 4.8. Collectionview تحطم على هذه الأجهزة. نحن بحاجة إلى إعادة فتح هذه المشكلة.

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:

[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:

[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

شكرا للمشاركة. سأحاول هذا. نرى أيضًا قدرًا كبيرًا من الأعطال فيما يتعلق بهذه المشكلة.

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:

[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

بعض الأبطال لا يرتدون الكاب

rmarinhosamhouts هل يمكننا إعادة فتح هذا الخطأ؟ تمكنت من التكرار مرة أخرى باستخدام نسخة معدلة من العينة انظر أعلاه ويبدو أن المزيد من الأشخاص يواجهون المشكلة.

أواجه نفس المشكلة أيضًا حتى مع أحدث النماذج. لا شل ، لا رؤوس أو تذييلات.

أواجه نفس المشكلة ، ولكن مع ListView على iPad يعمل بنظام iOS 12.4.8 و iPhone يعمل بنظام iOS 12.4.1 ، ولكن ليس على الأجهزة التي تعمل بنظام iOS 13. أنا أستخدم Xamarin Forms 4.7 SR5 التي تستهدف iOS 13.4.

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

أي حلول بديلة لـ ListView؟

@ rd09 لا يستخدم ListView GroupableItemsViewController. هل أنت متأكد أنك لا تستخدم CollectionView؟

@ rd09 لا يستخدم ListView GroupableItemsViewController. هل أنت متأكد أنك لا تستخدم CollectionView؟

شكرا لك على التنبيهات ، أنت على صواب. افترضت ذلك بطريقة ما ولكن بعد مراجعة الكود المصدري والتحقق ، قررت تطبيق الحل البديل الذي نشره

باستخدام حل @ l0gaw لإصلاح الأعطال التي كنت أراها سابقًا ، لكنني الآن أتلقى

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

نرى هذا أيضًا على نظام التشغيل iOS 12 فقط ، ولم نعثر على حل بديل حتى الآن.

لدي هذا الخطأ أيضًا في iPad

  • XAMARIN 4.7.1 تحديث
  • iOS 13.5.1

SIGABRT: لا يمكن الوصول إلى كائن تم التخلص منه.

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

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:

[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

@ l0gaw هل أحتاج إلى تنفيذ CustomRenderer فقط في مشروع iOS أم أحتاج إلى شيء آخر في المشروع الرئيسي؟

matheuscschenfeld في مشروع iOS

أيضًا لا تزال تواجه هذه المشكلة ، الحل البديل لا يصلح ذلك

تعديل
أصلحت مشكلتي. كنت أقوم بربط أمر model بدلاً من أمر viewmodel. لم يتم تحديث هذا الربط عند التبديل بين نماذج العرض. لذلك بدلاً من رفض عنصر مجموعة في مصدر نموذج العرض الجديد ، أراد إزالة عنصر من المجموعة التي تم التخلص منها بالفعل.
عدم وجود مشكلة بعد الآن عند تغيير الارتباط بنموذج العرض بدلاً من النموذج.

يجب أن تكون حذرًا عند استخدام الحل البديل الذي تم نشره لأن السطر الذي يقوم بتعيين عنصر SelectedItem إلى قيمة خالية يؤدي إلى تشغيل حدث SelectedItem ، لذلك إذا كان لديك ربط ثنائي الاتجاه تم تعيينه لتلك الخاصية ولم تتحقق من وجود قيمة خالية ، فسيؤدي ذلك إلى استثناء. لقد أزلت الخط تمامًا لأنني لا أعتقد أنه ضروري للحل البديل.

samhouts أي تحديث حول ما إذا كان سيتم التقاط هذا قريبًا جدًا. تحدث نفس المشكلة أيضًا في Listview. إصدار النموذج 4.7.0.1080

أعتقد أن هذا قد يتم إصلاحه على Xamarin.Forms 5.x أو ربما الانتظار حتى MAUI. أتمنى أن أكون مخطئا

أنا أعيد إنتاج هذه المشكلة أيضًا على Xamarin 4.8 على محاكي iOS

samhoutshartez كثير من الناس ما زالوا بالتبليغ عن هذا الخلل كبير إلى حد ما. كان نطاق هذا الخطأ صغيرًا جدًا بحيث لا يمكن تلخيص المشكلة الفعلية.

إنه لأمر مثير للإعجاب أن هذا لم يتم إصلاحه بعد ، لدي أيضًا هذا الخطأ ، لم يعمل CollectionView بشكل صحيح على iOS

كان حل @ l0gaw يعمل ، لكنه لم يعد كذلك الآن. لا يمكن معرفة ما إذا كان من آخر تحديث لنظام iOS أم لا ، لكنه أصبح مزعجًا حقًا - يتعطل في كل مكان من التحديث البسيط / الواضح

mduchev أرى هذا أيضًا. يحدث ذلك على كل من iOS 13 و 14. الشيء الوحيد الذي تغير بالنسبة لي هو الانتقال إلى Xamarin.iOS 14. محاولة معرفة ما إذا كان بإمكاني التوصل إلى حل بديل الآن.

على وجه التحديد ، هذا هو المكدس الذي أراه الآن:

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)

بعد نشر الحل البديل المقترح ، أرى الآن هذا الاستثناء في App Center: System.IndexOutOfRangeException: IItemsViewSource فارغ

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

هل تقوم بإزالة عنصر من المجموعة؟ إذا كان الأمر كذلك ، فربما تكون قد واجهت مشكلة أخرى تم الإبلاغ عنها (والتي أواجهها أيضًا باستمرار) - https://github.com/xamarin/Xamarin.Forms/issues/9632. إذا لم يكن الأمر كذلك ، فأنا أفترض ، كما قلت أعلاه ، أن الحل البديل لا يعمل في جميع الحالات ، للأسف.

تمكنت من إعادة إنشاء آخر إصدار نشرته. عندما أقوم بالانتقال إلى شاشة بها CollectionView وأقوم بتعديلها إما بإضافة عنصر أو إزالته ، ثم إغلاق الشاشة يتم طرح هذا الاستثناء. إذا انتقلت إلى نفس الشاشة ولم أقم بتعديل CollectionView ، فقم بالخروج من الشاشة ، فلن يتم طرح الاستثناء. لا يزال الحل يعمل بالنسبة لي ، على الرغم من أنني اضطررت إلى إعادة بناء بعض المناطق لأن مسح CollectionView سيتعطل. لذلك ، سيقدم الحل البديل بالتأكيد مشكلات جديدة. أعتقد أن الرهان الأكثر أمانًا في هذه المرحلة هو عدم استخدام CollectionViews.

لدي نفس المشكلة.
السيناريو هو

  • إنشاء عرض دائري
  • استخدم عرض المجموعة داخل قالب العرض الدائري
  • على سبيل المثال ، انقر فوق العناصر الدائرية وعناصر التجميع ؛ جعلهم الدول تتغير - cliecked
  • حاول تحديث جزء xaml وتحقق مما إذا تم تحديث العرض عبر إعادة التحميل السريع
  • انقر فوق carouselview - collection view items مرة أخرى

عند هذه النقطة ، يظهر خطأ في تجربتي.

  • يحدث ذلك في وضع التصحيح باستخدام محاكي ios
  • لكن لم أتمكن من إعادة إنتاجه على جهاز iPhone الذي تم نشره في وضع الإصدار.
  • الخطأ هو الحال فقط في وضع التصحيح بالنسبة لي.

سيكون إصلاحه أسهل كثيرًا إذا كان بإمكان شخص ما تقديم مشروع عينة بأحدث حزم Xamarin. لا يبدو أنني قادر على تحديد الحالة بالضبط عندما يحدث هذا باستمرار. إذا استطاع شخص ما ، يرجى تقديم مشروع تجريبي يصف المشكلة حتى يمكن إصلاحها بسرعة.

mduchev هل رأيت هذا التعليق من @ daves1992؟

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

أسأل فقط لأنه مدفون إلى حد ما في سيل التعليقات. ألا يعيد إنتاج المشكلة لك؟

lafritay للأسف ، لا. أنا قادر على تشغيل المشروع على جهاز محاكاة وجهاز دون أي مشاكل. لا يبدو أن التنقل بين الصفحات يؤدي إلى تشغيل الاستثناء.

lafritay للأسف ، لا. أنا قادر على تشغيل المشروع على جهاز محاكاة وجهاز دون أي مشاكل. لا يبدو أن التنقل بين الصفحات يؤدي إلى تشغيل الاستثناء.

ما هو إصدار IOS؟

تمكنت من تكرارها على 12.4.1 لكنني لا أعتقد أنها تكررت في الإصدارات الأحدث.

سيكون إصلاحه أسهل كثيرًا إذا كان بإمكان شخص ما تقديم مشروع عينة بأحدث حزم Xamarin. لا يبدو أنني قادر على تحديد الحالة بالضبط عندما يحدث هذا باستمرار. إذا استطاع شخص ما ، يرجى تقديم مشروع تجريبي يصف المشكلة حتى يمكن إصلاحها بسرعة.

يجب أن تكون على نظام التشغيل iOS 12 لإعادة إنشائه.

@ rd09 غير صحيح. كنت أرى نفس الخطأ على أجهزة iOS 13 وأراه الآن مرة أخرى على أجهزة iOS 14. لسوء الحظ ، لا يبدو أن نماذج المشاريع تعيد إنشاء المشكلة ، لذا أفترض أنها لا تزال قائمة في شكل آخر.

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

لا يوجد حل بديل.

mduchev @ rd09 تمكنت من الحصول على نسخة بسيطة:

Bugs.zip

بمجرد تحميل التطبيق ، انتظر حتى يتم تحميل العناصر. ثم قم بما يلي:

  1. انتقل إلى صفحة حول باستخدام القائمة
  2. انتقل مرة أخرى إلى صفحة العناصر (يجب أن تكون فارغة)
  3. استخدم "سحب للتحديث" لتحديث الصفحة. يجب أن يحدث الاستثناء عند انتهاء تحميل العناصر.

المفتاح لتحقيق ذلك هو هذا السطر في ItemsPage.xaml.cs

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

المشكلة هي أنه إذا تم تحديث CollectionView.ItemsSource على الإطلاق ، فلن يتم التخلص من ItemsViewSource الذي يحتوي على القيمة الأصلية. وبالتالي ، فإنه يحتفظ بمعالج CollectionChanged ويتفاعل مع التغييرات. إذا تم تحديث المجموعة بعد ذلك بعد الانتقال بعيدًا عن الصفحة (على سبيل المثال ، بسبب بطء اتصال الشبكة) ، فإن ItemsViewSource سيصل إلى ItemsViewController التخلص منه.

أعتقد أن المشكلة هي طريقة UpdateItemsSource في هذا الملف: https://github.com/xamarin/Xamarin.Forms/blob/5.0.0/Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewController.cs . لا يتخلص من القيمة التي يحتفظ بها ItemsSource الرغم من أنه يبدو أنه يمتلك عمر الكائن.

يبدو أن هذا تم تأكيده من خلال حقيقة أن نظيره في Android يتخلص من الكائن (راجع UpdateItemsSource في هذا الملف: https://github.com/xamarin/Xamarin.Forms/blob/79cc0f49fe90a59f02aa0490072b449ccdad4a27/Xamarin.Forms .Platform.Android / CollectionView / ItemsViewAdapter.cs)

وأعتقد أن أحد الأسباب الكبيرة لاستمرار حدوث ذلك هو أن الحل البديل الذي يستخدمه العديد من الأشخاص يفقد القيم الخالية خارج مصدر العناصر عند استدعاء التخلص.

lafritay أنا باستخدام هذا الحل البديل الذي يبدو أنه يعمل في اختبار قصير. هذا لا يصلح التخلص تمامًا عندما يتم تغيير مصدر المجموعة بشكل صحيح ، ولكنه يمنع الأعطال التي تعرضت لها

""
باستخدام Example.Controls ؛
باستخدام example.iOS.Renderers ؛
باستخدام Xamarin.
باستخدام Xamarin.Forms.Platform.iOS ؛

[التجميع: ExportRenderer (typeof (ExtendedCollectionView) ، typeof (ExtendedCollectionViewRender))]
مساحة الاسم مثال. دائرة الرقابة الداخلية
{
فئة عامة ExtendedCollectionViewRender: CollectionViewRenderer
{
تجاوز محمية GroupableItemsViewControllerCreateController (GroupableItemsView itemsView، ItemsViewLayout layout)
{
إرجاع CustomGroupableItemsViewController الجديدة(itemsView ، التخطيط) ؛
}
}
}

باستخدام Xamarin.
باستخدام Xamarin.Forms.Platform.iOS ؛

مساحة الاسم مثال. دائرة الرقابة الداخلية
{
فئة عامة CustomGroupableItemsViewController: GroupableItemsViewController
حيث TItemsView: GroupableItemsView
{
عامة CustomGroupableItemsViewController (TItemsView selectableItemsView، ItemsViewLayout layout): base (selectableItemsView، layout)
{
}

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

}

باستخدام النظام ؛
باستخدام الأساس
باستخدام Xamarin.Forms.Platform.iOS ؛

مساحة الاسم مثال. دائرة الرقابة الداخلية
{
فئة داخلية EmptySource: IItemsViewSource
{
GroupCount العامة int => 0 ؛

    public int ItemCount => 0;

    public bool Loop { get ; set; }

    public int LoopCount => 0;

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

    public int ItemCountInGroup(nint group) => 0;

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

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

    public void Dispose()
    {
    }
}

}

jormenjanssen هذا هو الحل الكامل الخاص بي:

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

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

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

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

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

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

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

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

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

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

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

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

            base.Dispose(disposing);
        }
    }
}

لقد وجدت حلاً لهذا الخطأ. قمت بإنشاء عارض مخصص لـ Collectionview وقمت بتجاوز طريقة التخلص.
هذا هو رمز العارض المخصص:
[التجميع: ExportRenderer (typeof (CollectionView) ، typeof (CustomCollectionViewRenderer))]
Project.iOS.Renderers
{
فئة عامة CustomCollectionViewRenderer: CollectionViewRenderer
{
التخلص من باطل التجاوز المحمي (التخلص المنطقي)
{
base.ItemsView.SelectedItem = خالية ؛
base.ItemsView.ItemsSource = خالية ؛
القاعدة. التخلص (التخلص) ؛
}
}
}

@ l0gaw هل أحتاج إلى تنفيذ CustomRenderer فقط في مشروع iOS أم أحتاج إلى شيء آخر في المشروع الرئيسي؟

نجح هذا الحل في حالتي. لقد أزلت أيضًا السطر "ItemsView.SelectedItem = null" لأنه ليس ضروريًا في حالتي تمامًا مثل ما قاله @ rd09 .

حدثت نفس المشكلة معي ، أي حل أو حل بديل؟ ... هذا هو تتبع المكدس ...
أنا أستخدم أحدث إصدار مستقر من نماذج xamarin
باستخدام AppShell
يحدث في iOS 12
NSObject.get_SuperHandle ()
UICollectionViewController.get_CollectionView ()
ItemsViewController`1 [TItemsView] .GetPrototype ()
العناصر ViewLayout.DetermineCellSize ()
ListViewLayout.ConstrainTo (CoreGraphics.CGSize الحجم)
العناصر ViewLayout.UpdateConstraints (CoreGraphics.CGSize Size)
ItemsViewLayout.InvalidateLayout ()
(تم إدارة برنامج التضمين إلى أصلي) UIKit.UIApplication.UIApplicationMain (int ، سلسلة [] ، intptr ، intptr)
UIApplication.Main (System.String [] args ، System.IntPtr الأساسي ، System.IntPtr المفوض)
UIApplication.Main (System.String [] args ، System.String mainClassName ، System.String DelegateClassName)
Application.Main (System.String [] args)

BugExample.zip

@ rmarinho تمكنت من تكرارها عن طريق تغيير العينة قليلاً.

أضفت تأخيرًا قدره 100 مللي ثانية لتعيين خاصية العناصر.

أيفون 6
iOS 12.4.5
Xamarin الأشكال 4.8

لم يعد هذا repro يتعطل اعتبارًا من 4.8.0.1364.

mduchev @ rd09 تمكنت من الحصول على نسخة بسيطة:

Bugs.zip

لم يعد هذا repro يلقي ObjectDisposedException في 5.0.0-pre3.

حدثت نفس المشكلة معي ، أي حل أو حل بديل؟ ... هذا هو تتبع المكدس ...
أنا أستخدم أحدث إصدار مستقر من نماذج xamarin

ahmedroshdy هل ترى هذا باستخدام Xamarin.Forms 4.8.0.1560؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات