0

NSCollectionViewがあり、ビューはラベルとNSButtonを持つNSBoxです。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にバインドされているものだけなので、delegateとviewItemであるということです。これは、表現されたオブジェクトを取得してデリゲートに送信できないことを意味します。

この限られた範囲を回避する方法、または表現されたオブジェクトを取得するためのより良い方法はありますか?

ありがとう。

4

1 に答える 1

0

まず、ビューをサブクラス化する必要はほとんどありません。

バインドはあなたが思うことをしません-あなたはaddObserver:forKeyPath:options:context:が欲しいです(あなたは-bindがthoのために何であるかを理解しようとするべきです)。

「鍵はNSCollectionViewItemの「プロトタイプ」ビューであるようです」と言うと、本当に混乱していると思います…</ p>

IBOutletとIBActionを忘れてください-InterfaceBuilderでない場合、これらは何の意味もありません。「プロトタイプ」はObjective-cでは何も意味しません。

ビュー内の2つのメソッドには、まったく異なるスコープはありません。これらのメソッドにまったく違いはありません。これらは両方ともメソッドであり、名前(およびもちろんそれらに含まれるコード)を除いてすべての点で同等です。

WizardItemが-startでnullであるが、-mouseDownに値がある場合、これは完全にそれらが呼び出されるタイミングと関係があります。すぐに消えてしまうオブジェクトがあるか、思った時点でまだ作成されていないオブジェクトがあります。

NSZombieに精通していますか?とても便利です。

于 2010-05-19T22:19:45.133 に答える