كيف يمكنني ربط برمجيا في رأي فئة فرعية من NSCollectionView?

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

سؤال

لقد نجحت في خلق NSCollectionView و إضافة تسمية إلى عرض النموذج في IB, لا بد أن خاصية من تمثيل كائن.أريد الآن أن برمجيا إنشاء NSButton و NSTextField مع NSTextField لا بد أن خاصية من تمثيل كائن.عند النقر فوق الزر أريد أن إظهار وإخفاء NSTextField.

المشكلة جئت عبر هو لو وضعت رمز التهيئة أجل التحكم في عرض لاستخدام هذه الطريقة اضع + طريقة و الربط في الرأي awakeFromNib ، ملزمة لا تحصل على مدمن مخدرات.إذا وضعت التهيئة أجل التحكم في awakeFromNib ، عندما يتم النقر على زر, أنا لم يكن لديك الوصول إلى عناصر التحكم في وجهة نظري (وهي فارغة عند طباعتها باستخدام NSLog).

من ما أستطيع أن أقول أنه يبدو وكأنه قد تكون المشكلة أن الطريقة NSCollectionView يعمل هو, أنه يخلق مثيل من عرض ، ثم نسخ ذلك في كل العديد من الكائنات في جمع الرأي.كيف يمكنني الحصول على الأزرار إلى تهيئة ملزمة للعمل مع نسخ من النموذج ؟

أدناه هو رمز التهيئة و ملزمة في awakeFromNib لبلدي ثم subclassed عرض:

SubView.ح

@interface SubView : NSView {
    NSButton *button;
    NSTextField *textField;
    IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}

- (IBAction)buttonClicked:(id)sender;

@end

SubView.م

@implementation SubView

- (id)initWithCoder:(NSCoder *)decoder
{
    id view = [super initWithCoder:decoder];

    button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
    [button setTitle:@"Begin Editing"];
    [button setTarget:self];
    [button setAction:@selector(buttonClicked:)];
    [self addSubview:button];

    textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
    [self addSubview:textField];

    return(view);
}

- (void)awakeFromNib
{   
        // Bind the textField to the representedObject's name property
        [textField bind:@"value" 
       toObject:item 
        withKeyPath:@"representedObject.name" 
        options:nil];
}

- (IBAction)buttonClicked:(id)sender
{
    [button setTitle:@"End Editing"];
    [textField setHidden:YES];
}

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

المحلول

وهذا يبدو مماثلا لشيء فعلته فقط، لذلك ربما يكون ما تحتاجه.

NSCollectionView و تجاوز:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

في newItemForRepresentedObject:، إستعادة هذا البند الرأي، ثم إضافة عناصر التحكم الخاصة بك وأي ربط البرامج:

@implementation NSCollectionViewSubclass

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    // Allow the superclass to create or copy the collection view item
    NSSCollectionViewItem *newItem = [super newItemForRepresentedObject:object];

    // Get the new item's view so you can mess with it
    NSView *itemView = [newItem view];

    //
    // add your controls to the view here, bind, etc
    //

    return newItem;
}

@end

ونأمل أن هذا هو في مكان ما بالقرب من المكان عليك أن تكون ...

نصائح أخرى

-awakeFromNib لا يسمى على عرض عن NSCollectionViewItem إذا كان هذا الرأي هو في نفس بنك الاستثمار القومي كما NSCollectionView ، ولكن إذا وضعت رأي مستقل بنك الاستثمار القومي.

  • خلق فارغة ملف بنك الاستثمار القومي (BlahBlahCollectionViewItem.بنك الاستثمار القومي).
  • قطع المجموعة البند نظر من أي بنك الاستثمار القومي لديك في
  • لصقه في ملف بنك الاستثمار القومي
  • تغيير فئة من صاحبها إلى NSCollectionViewItem.
  • الاتصال عرض المخرج عن مالك حديثا لصق عرض
  • فتح بنك الاستثمار القومي الملف الذي يحتوي على NSViewController
  • حدد المرتبطة NSViewControllerItem
  • تغيير اسم بنك الاستثمار القومي الملكية إلى اسم جديد بنك الاستثمار القومي
  • نضع الكود في -awakeFromNib

لا يسمى -awakeFromNib لوجهات النظر نسخ من النموذج NSCollectionViewItem. وضع مدونة سلوك ملزمة بك في initWithCoder:، ويجب أن يكون على ما يرام.

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