كيف يمكنني إزالة جميع العناصر من NstableView التي يتحكم فيها NSArrayController؟

StackOverflow https://stackoverflow.com/questions/646787

  •  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, ، لكن:

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

المحلول

لا تقم بإزالة العناصر من عرض الجدول. لا يحتوي على أي عناصر - فهو يعرض فقط عناصر كائن آخر.

إذا قمت بربط صفيف محتوى وحدة تحكم 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))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top