كيف يمكنني إزالة جميع العناصر من NstableView التي يتحكم فيها NSArrayController؟
-
22-07-2019 - |
سؤال
أنا أستخدم NSArrayController
, NSMutableArray
و NSTableView
لإظهار قائمة بكائناتي المخصصة (على الرغم من أن هذا السؤال قد ينطبق على الأرجح إذا كنت تعرض قائمة بالفانيليا فقط NSString
الكائنات أيضا).
في نقاط مختلفة من الوقت ، أحتاج إلى مسح صفيف بلدي وتحديث البيانات من مصدر البيانات الخاص بي. ومع ذلك ، مجرد الاتصال removeAllObjects
على بلدي NSMutableArray
الكائن لا يؤدي إلى تحديثات KVO ، لذلك تظل القائمة على الشاشة دون تغيير.
NSArrayController
لديها رقم removeAllObjects
الطريقة المتاحة ، والتي تبدو غريبة حقا. (لديها addObject
, ، والتي أستخدمها لإضافة الكائنات ، التأكد من تشغيل KVO وتحديث واجهة المستخدم.)
أنظف طريقة تمكنت من التسبب في حدوث ذلك بشكل صحيح هي:
[self willChangeValueForKey:@"myArray"];
[myArray removeAllObjects];
[self didChangeValueForKey:@"myArray"];
... لذلك أنا نوع من الاضطرار إلى القيام بإخطار KVO يدويًا بنفسي (هذا في فئة تطبيق الاختبار الخاصة بي ، يحتوي على myArray
الممتلكات التي هي NSMutableArray
, ، كما ذكر.)
هذا يبدو خطأ - هل هناك طريقة أفضل؟ من googling الخاص بي ، يبدو أن عدد قليل من الناس في حيرة من العمر removeAllObjects
في NSArrayController
, ، لكن لم أر أي حلول أفضل.
لقد رأيت هذا الحل:
[self removeObjectsAtArrangedObjectIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0, [[self arrangedObjects] count])]];
لكن هذا يبدو أكثر سارة بالنسبة لي. على الأقل ، فإن الحل الخاص بي هو على الأقل توثيق ذاتي بشكل هامشي.
لم تلاحظ Apple أنه في بعض الأحيان قد يرغب الأشخاص في تفريغ التحكم في القائمة التي تتم إدارتها عبر NSArrayController
هدف؟ يبدو هذا واضحًا ، لذلك أعتقد أنني يجب أن أفتقد شيئًا ...
جانبا: بالطبع ، إذا قمت بإضافة عناصر جديدة إلى الصفيف (عبر NSArrayController
) ، ثم يؤدي هذا إلى تحديث KVO مع NSArrayController/NSTableView
, ، لكن:
- في بعض الأحيان لا أضع أي عناصر في القائمة ، لأنه لا يوجد شيء. لذلك أنت فقط ترى العناصر القديمة.
- هذا هو صوتي قليلا على أي حال.
المحلول
لا تقم بإزالة العناصر من عرض الجدول. لا يحتوي على أي عناصر - فهو يعرض فقط عناصر كائن آخر.
إذا قمت بربط صفيف محتوى وحدة تحكم Array بخاصية صفيف لبعض الكائنات الأخرى ، فيجب أن تعمل مع خاصية هذا الكائن. يستخدم [[object mutableArrayValueForKey:@"property"] removeAllObjects]
.
إذا ، من ناحية أخرى ، لم تكن قد ربطت مجموعة محتوى محتوى وحدة تحكم Array ، فأنت بحاجة إلى التفاعل معها content
مباشرة. يستخدم [[arrayController mutableArrayValueForKey:@"content"] removeAllObjects]
. (يمكنك أيضًا العمل مع arrangedObjects
بدلاً من content
. إذا لم ينجح أحد ، جرب الآخر - لقد فعلت الأشياء فقط في الطريقة الأولى ، وربط وحدة تحكم الصفيف بشيء آخر.)
نصائح أخرى
هل كانت هذه المشكلة أيضًا وحلها بهذه الطريقة:
NSArrayController* persons = /* your array controller */;
[[persons content] removeAllObjects];
سريع
@IBOutlet var acLogs: NSArrayController!
acLogs.removeObjects(acLogs.content as! [AnyObject])
عملت بالنسبة لي.
الحل في سويفت:
if let ac = arrayController
{
let range:NSRange = NSMakeRange(0, ac.arrangedObjects.count);
let indexSet:NSIndexSet = NSIndexSet(indexesInRange: range);
ac.removeObjectsAtArrangedObjectIndexes(indexSet);
}
مجرد تحديث يعمل في سويفت 4:
let range = 0 ..< (self.arrayController.arrangedObjects as AnyObject).count
self.arrayController.remove(atArrangedObjectIndexes: IndexSet(integersIn: range))