سؤال

وفي طلبي الذي أدليت به بسيط جدا ملزمة. لدي NSMutableArray منضم إلى NSArrayController. وحدة تحكم نفسها لا بد أن تحرير وسرد وهذا يظهر عن محتوى NSMutableArray. يعمل بشكل جيد.

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

ولكن الربط من NSMutableArray <-> NSArrayController <->. NSComboBox لا تحديث

لا يهم إذا كنت إزالة كافة الكائنات من صفيف تحرير وسرد لا يزال يظهر نفس البنود.

ما هو الخطأ هنا؟ هو وجهة نظري خطأ أو أقوم عليك سوى أن تقول الربط لتحديث نفسها؟ لم أكن معرفة كيفية القيام بذلك.

هل كانت مفيدة؟

المحلول

وأنت من المحتمل "تحرير مجموعة من وراء ظهر وحدة التحكم"، الذي يفسد الآلية المنظمة من.

وقال لك:

<اقتباس فقرة>   

ولدي NSMutableArray منضم إلى NSArrayController.

وكيف؟ أين تعيش مجموعة؟ في وثيقة، والمتوافقة الوصول إليها عن طريق KVC / المنظمة من -myArray / -setMyArray: مجموعة من يمكنهم الدخول

وأراهن كنت أقول بشكل مباشر "myArray" ايفار إلى -removeAllObjects، أليس كذلك؟ كيف سيكون هذه accessors KVC / المنظمة من "معرفة" لقد تغيرت مجموعة؟

والجواب هو، لم يفعلوا ذلك. إذا كنت استبدال حقا مجموعة كاملة، فأنت تريد أن تقول المستند (أو كل من يملك مجموعة) ل-setMyArray: لمجموعة جديدة كاملة. هذا وسوف يؤدي المكالمات المنظمة من مناسبة.

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

و(الوثائق - انظر أنماط مجموعة ثانوي للقسم لكثير خصائص) http://tinyurl.com/yb2zkr5

نصائح أخرى

وجرب هذا (باستخدام ARC / OS X 10.7):

وفي ملف الرأس، وتحديد arrayInstance وarrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

وبعد ذلك في تنفيذ

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

وهذا سيجبر arrayController لتحديث المحتوى وعرضه بشكل صحيح.

ولكن 2 خط آخر من حل كود ستكون كما يلي:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

وفكر النظرات الأولى أكثر وضوحا، وأكثر من الثانية المنظمة من مثل.

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

وكريستيان

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top