سؤال

وأواجه بعض المشاكل عرض محتويات أحد NSArrayController في إطارين المحددة في XIBs مختلفة.

في نافذتي الرئيسي (في MainMenu.xib)، لدي NSTableView التي لا بد لNSArrayController

في بلدي XIB الثاني، ولدي نافذة أخرى تحتوي على NSTableView. أنا خلق جديد NSArrayController، وملزمة الجدول إلى محتويات هذا NSArrayController.

لا بد كلا NSArrayControllers إلى نفس NSArray بالضبط.

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

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

والمشكلة هي أنني لا يمكن معرفة كيفية القيام بذلك في واجهة البناء. أنا لا يمكن ربط لNSArrayController إلى NSArrayController آخر (I الحصول على خطأ وقت التشغيل مشيرا إلى أنه يمكن أن تكون ملزمة فقط لNSArray). سوف يربط NSArrayController للعضو NSArrayController من المالك الملف لن يساعد أيضا، لأن ذلك سوف يمسح للتو NSArrayController التي أريد أن استخدام.

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

<القوي> تحديث: في الرد على الجواب تشاك وتعليقات، حاولت ما يلي: -Bound محتوى جدول بلدي NSTableView إلى arrangedObjects من عضو NSArrayController (إذا كنت تستخدم NSArrayController نفسه، ظهر خطأ في السجل: "[NSArrayController العد]: محدد غير المعترف بها إرسالها إلى المثال") -Bound كل عمود في الجدول لصاحب الملف، ومع مسار مفتاح نموذج arrayController.arrangedObjects.propertyName

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

وعادة، وأود أن اختيار بلدي NSArrayController من "ربط إلى" تحرير وسرد arrangedObjects استخدامها بوصفها مفتاح تحكم، والخاصية نفسها على أنها نموذج مسار مفتاح. لست متأكدا من كيفية القيام بما يعادل أنه في هذه الحالة - لو أستطيع على الإطلاق

ولم أفعل شيئا خطأ في عملية أعلاه؟

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

المحلول

والخيار الأفضل أن أكون قد تمكنت من الخروج مع هو إخطار NSArrayController الثاني هو أن مجموعة انها إدارتها قد تغير من خلال الدعوة rearrangeObjects: على ذلك. ويبدو عالي الكعب، لكنه يعمل.

نصائح أخرى

وماذا عن وضع لهم على النحو الكائنات الوكيل في IB ثم instantiating الفعلية في التعليمات البرمجية، ربما في تفويض تطبيقك؟

ويمكنك الحصول على كل NSArrayControllers لتحديث عن طريق المنظمة من عند إضافة مجموعة ل. الحيلة هي أن لديك لمراقبة وإضافة إلى مجموعة بطريقة متوافقة مع المنظمة من.

وكنت تريد بعض الكائن الذي يملك مجموعة، دعنا نسميها "نموذج". مجموعة يجب أن يكون مفتاح على الكائن، دعونا ندعو مفتاح "contentArray". بعد ذلك، عند إضافة إلى / إزالة من، عليك أن تفعل ذلك من خلال الدعوة لأول مرة mutableArrayForKey على "نموذج" للحصول على "contentArray". ثم إضافة / إزالة من مجموعة يجب أن تعمل، على سبيل المثال:

لا بد Controller1 إلى self.model.contentArray

لا بد Controller2 إلى self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

وبدلا من ذلك يمكنك أن تفعل الإخطارات المنظمة من يدويا مثل هذا:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

وليس هناك سبب وجود اثنين من وحدات التحكم مجموعة يجب أن يجعل واحدة نظرا يتم تحديث عند تحديث من خلال بعضها البعض. إذا كان هذا لا يحدث، وهذا يبدو مثل الإخطارات المنظمة من الخاص بك والتخبط في مكان ما. الأرجح أنك تقوم بتحرير مباشرة مجموعة (في طريقة add: على فئة فرعية NSArrayController، وربما؟) دون إرسال الإخطارات التغيير السليم.

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