8

NSCollectionView でダブルクリックをプログラムに認識させようとしています。このガイドに従ってみました: http://www.springenwerk.com/2009/12/double-click-and-nscollectionview.htmlしかし、IconViewBox のデリゲートが null であるため、実行しても何も起こりません:

h ファイル:

@interface IconViewBox : NSBox
{
    IBOutlet id delegate;
}
@end

m ファイル:

@implementation IconViewBox

-(void)mouseDown:(NSEvent *)theEvent {
    [super mouseDown:theEvent];

    // check for click count above one, which we assume means it's a double click
    if([theEvent clickCount] > 1) {
        NSLog(@"double click!");
        if(delegate && [delegate respondsToSelector:@selector(doubleClick:)]) {
            NSLog(@"Runs through here");
            [delegate performSelector:@selector(doubleClick:) withObject:self];
        }
    }
}

デリゲートが null であるため、2 番目の NSLog は出力されません。nib ファイルのすべてを接続し、指示に従いました。これを行う理由または別の理由を誰かが知っていますか?

4

3 に答える 3

7

コレクション アイテムのビューをサブクラス化することで、コレクション ビュー アイテム内の複数のクリックをキャプチャできます。

  1. 複数のクリックを検出するメソッドをサブクラスNSView化して追加するmouseDown:
  2. nib の NSCollectionItem のビューを から に変更しNSViewますMyCollectionView
  3. collectionItemViewDoubleClick:関連する実装NSWindowController

これは、NSViewサブクラスにダブルクリックを検出させ、レスポンダー チェーンを渡すことで機能します。実装するレスポンダー チェーンの最初のオブジェクトcollectionItemViewDoubleClick:が呼び出されます。

通常、collectionItemViewDoubleClick:関連するNSWindowControllerに実装する必要がありますが、レスポンダー チェーン内の任意のオブジェクトに実装できます。

@interface MyCollectionView : NSView
/** Capture double-clicks and pass up responder chain */
-(void)mouseDown:(NSEvent *)theEvent;
@end

@implementation MyCollectionView

-(void)mouseDown:(NSEvent *)theEvent
{
    [super mouseDown:theEvent];

    if (theEvent.clickCount > 1)
    {
        [NSApplication.sharedApplication sendAction:@selector(collectionItemViewDoubleClick:) to:nil from:self];
    }
}

@end
于 2013-09-19T07:37:34.137 に答える
0

あなたが言ったことにもかかわらず、チュートリアルのステップ 4 に従っていることを確認する必要があります。

4. Open IconViewPrototype.xib in IB and connect the View's delegate outlet with "File's Owner":

残りの手順に従っていれば、それで問題ありません。

于 2013-01-29T04:10:19.120 に答える