Обойти IBActions ограниченную сферу - PullRequest
0 голосов
/ 18 мая 2010

У меня есть NSCollectionView, и представление - NSBox с меткой и NSButton. Я хочу двойной щелчок или щелчок NSButton, чтобы сказать контроллеру выполнить действие с представленным объектом NSCollectionViewItem. Вид элемента был разделен на подклассы, код выглядит следующим образом:

#import <Cocoa/Cocoa.h>
#import "WizardItem.h"

@interface WizardItemView : NSBox {
    id delegate;
    IBOutlet NSCollectionViewItem * viewItem;
    WizardItem * wizardItem;
}

@property(readwrite,retain) WizardItem * wizardItem;
@property(readwrite,retain) id delegate;

-(IBAction)start:(id)sender;

@end

#import "WizardItemView.h"

@implementation WizardItemView
@synthesize wizardItem, delegate;

-(void)awakeFromNib {   
    [self bind:@"wizardItem" toObject:viewItem withKeyPath:@"representedObject" options:nil];
}

-(void)mouseDown:(NSEvent *)event {
    [super mouseDown:event];
    if([event clickCount] > 1) {
        [delegate performAction:[wizardItem action]];
    }   
}

-(IBAction)start:(id)sender {
    [delegate performAction:[wizardItem action]];
}


@end

Проблема, с которой я столкнулся, заключается в том, что в качестве IBAction единственными вещами в области действия -start являются вещи, которые были связаны в IB, поэтому делегируйте и viewItem. Это означает, что я не могу добраться до представленного объекта, чтобы отправить его делегату.

Есть ли способ обойти эту ограниченную область или лучший способ или получить представленный объект?

Спасибо.

1 Ответ

0 голосов
/ 20 мая 2010

Во-первых, вам почти никогда не нужно разделять представления на подклассы.

Bind не делает то, что вы думаете - вы хотите addObserver: forKeyPath: options: context: (вы должны попытаться понять, что -bind для этого).

Когда вы говорите, что «ключ, кажется, это« прототип »представления для NSCollectionViewItem», я думаю, что вы действительно запутались…

Забудьте IBOutlet и IBAction - они ничего не значат, если вы не Интерфейсный Разработчик. «Прототип» ничего не значит в Objective-c.

Два метода в представлении не имеют разной области видимости - между ними нет никакой разницы. Оба эти метода эквивалентны во всех отношениях, кроме их имен (и, конечно, кода, который они содержат).

Если wizardItem имеет значение null в -start, но имеет значение в -mouseDown, это полностью связано с синхронизацией их вызова. У вас либо есть объект, который уходит слишком рано, либо он еще не создан в точке, о которой вы думаете.

Вы знакомы с NSZombie? Вы найдете это очень полезным.

...