0

我有一个 NSCollectionView,视图是一个带有标签和 NSButton 的 NSBox。我想要双击或单击 NSButton 来告诉控制器使用 NSCollectionViewItem 的表示对象执行操作。Item View 已经被子类化,代码如下:

#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。这意味着我无法获取表示的对象以将其发送给委托人。

有没有办法绕过这个有限的范围或更好的方法或获取表示的对象?

谢谢。

4

1 回答 1

0

首先,您几乎不需要子类化视图。

Bind 不会按照您的想法做-您想要 addObserver:forKeyPath:options:context: (您应该尝试了解 -bind 是什么)。

当您说“关键似乎是 NSCollectionViewItem 的“原型”视图”时,我认为您真的很困惑……</p>

忘记 IBOutlet 和 IBAction - 如果您不是 Interface Builder,它们就没有任何意义。“原型”在 Objective-c 中没有任何意义。

视图中的两种方法在任何方面都没有不同的范围 - 它们之间根本没有区别。它们都是方法,除了它们的名称(当然还有它们包含的代码)之外,在其他方面都是等效的。

如果 wizardItem 在 -start 中为空,但在 -mouseDown 中有值,这完全与调用它们的时间有关。您要么有一个过早消失的对象,要么在您认为的某个时间点尚未创建。

你熟悉 NSZombie 吗?你会发现它非常有用。

于 2010-05-19T22:19:45.133 回答