كيف يمكنني الحصول على الممثل من وجهة نظر في nscolletionviewitem؟
-
13-09-2019 - |
سؤال
لدي وجهة نظر يتم استخدامها في كل عنصر من العناصر الخاصة بي. لدي iboutlet إلى CollectionViewItem من وجهة نظري، ولدي ذلك مدمن مخدرات في باني واجهة. أريد الوصول إلى قيمة من الممثل (وهو كائن بيانات أساسي) في رمز العرض الخاص بي. فيما يلي مثال على ما أحاول القيام به - الوصول إلى قيمة التسلسل للممثل:
في ملف .h:
IBOutlet NSCollectionViewItem *item; // Connected in IB
في ملف .m
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
أعلم أن SEQ قد يسكنني لأنني ألغيت ملزمة في عرض CollectionViewItem في IB باستخدام مسار المفتاح الممثل .seq وهذا يعمل.
أي فكرة لماذا عندما أحاول الوصول إلى القيمة الخاصة ب SEQ في التعليمات البرمجية لعرضها إرجاع NULL؟
المحلول
من المحتمل جدا أن NSCollectionViewItem لا ينسخ عبر اتصالات iBoutlet من وجهات نظر العناصر الخاصة بهم إلى النموذج الأولي NscollectionViewItem. لذلك، item
هو لا شيء، لذلك seq
سيكون أيضا nil.
النمط النموذجي للوصول إلى مثيل NSColletionViewItem هو ربط النموذج الأولي. لقد ذكرت أنك فعلت هذا وأنه يعمل. هذا ببساطة لأن هذه هي الطريقة النموذجية والمدعومة للقيام بذلك.
إذا كنت بحاجة فعلا إلى اتصال مباشرة بالعنصر بطريقة لا يمكن أن توفر الارتباطات، فربما عليك إعدادها يدويا. طريقة واحدة للقيام بذلك هي تجاوز NscolletionViewItem -copyWithZone:
, ، اتصل سوبر، ثم اجعل الاتصال يدويا.
نصائح أخرى
1) Subclass NSView المستخدمة في تقديم عنصر في عرض المجموعة
2) في هذه الفئة الفرعية، أضف ملكية مندوب
3) cublcass nscolletionviewitem
4) تجاوز SETVIEW: الطريقة. أضف خطا لتعيين خاصية المفوض للعرض إلى مثيل NscollectionViewItem (أي الذات).
الآن، داخل Subclass nsview، ستحصل على عنصر التموين المقابل عبر خاصية المفوض (على سبيل المثال، يمكنك الوصول إلى تمثيلها).
كان لدي نفس المشكلة، لكنني وجدت حلا سهلا للغاية: وضعت طريقة العرض بطريقة مختلفة وربط هذا في nscollectionViewItem (وهو في الواقع nsviewcontroller). ثم سيتم تشغيل .xib لتحقيق كل خلية ويتم تعيين جميع المنافذ.
- Subclass NSView.
- إضافة طريقة المندوب إلى الفئة الفرعية ... شيء مثل
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
لإخبار المستمع بالنقر فوق المستخدم على عنصر في فهرس معين. - اسحب عرض المجموعة باستخدام Self.SuperView في نفس الفصل. قم بإنشاء متغير لتخزين NSUINTEGER. تخزين فهرس العنصر باستخدام الطريقة
[[collectionView subviews] indexOfObject:self]
. وبعد تمرير هذا الفهرس في طريقة المندوبindex
معامل. - سيتمكن الفئة التي تتفق مع البروتوكول المحدد في NSView الخاص بك الآن من الاستماع من أي أحداث Mousedown في خلية محددة. إذا كنت تريد تمثيل عنصر معين، اتصل فقط
collectionView:itemAtIndex
واحصل على العنصر عن طريق الوصول إليه عبرrepresentedObject
الممتلكات فيNSCollectionViewItem
.