1

私は現在、OSX10.5以降のプロジェクトビルドに取り組んでいます。まず第一に、10.6ユーザーにはこれが表示されません。この問題が発生しているのは10.5ユーザーのみです。10.6ではこれを再現することはできません。

つまり、-(void)mouseUp:(NSEvent *)theEventのオーバーロード実装を使用してNSViewのカスタム拡張クラスを配置すると、NSSplitViewでラップされたときにmouseUpが呼び出されません。rightMouseUp:/ Down:拡張NSViewで機能します。

カスタムビューをウィンドウに配置するとイベントが呼び出され、nssplitviewで直接ラップすると、leopard(10.5)ユーザーに対してマウスアップが呼び出されません。

再現手順(10.5で!)

  1. 新しいココアプロジェクトを作成する
  2. 次のクラスを作成します
  3. ウィンドウにカスタムビューをドラッグして、クラスGTTestを作成します
  4. ウィンドウ上でスプリットビューをドラッグし、そのコンテンツビューの1つにGTTestを追加するだけです

クラス:

@interface GTTest : NSView {
}

#import "GTTest.h"
@implementation GTTest

- (void)mouseUp:(NSEvent *)theEvent {
 NSLog(@"Ger");
}

ウィンドウのGTTestディレクトリをクリックすると、適切な行がログに記録されます。NSSplitViewをクリックしても、何も実行されません(ブレークポイントも試してください)。rightMouseDown:/ Up:NSViewで動作します。

ps> splitviewにボタンを追加すると(nsresponderが正しい派生nsviewもありますか?)、IBActionメソッドが起動します。上記の私のクラスも正しく機能するために欠けているものは何ですか?

私に何ができる?

4

2 に答える 2

1

さて、私はこれに対する修正を見つけました:

NSSplitView の拡張クラスを実装し、メソッドをオーバーライドして、スプリッターがホバーされている (カーソルで検出可能) 場合はイベントを「バブルアップ」し、そうでない場合は何もしません。この何もしないと、イベントがカスタム ビューによって受信されます。

- (void)mouseUp:(NSEvent *)theEvent {
    if ([NSCursor currentCursor]==[NSCursor resizeLeftCursor] 
        || [NSCursor currentCursor]==[NSCursor resizeRightCursor]
        || [NSCursor currentCursor]==[NSCursor resizeLeftRightCursor]) {
        [super mouseUp:theEvent];
    } 

    if ([NSCursor currentCursor]==[NSCursor resizeUpCursor] 
        || [NSCursor currentCursor]==[NSCursor resizeDownCursor]
        || [NSCursor currentCursor]==[NSCursor resizeUpDownCursor])
    {
        [super mouseUp:theEvent];
    }
}

そのクラスを分割ビューとして使用します。突然、イベントがカスタム NSView に受信されます。奇妙だが本当だ!

于 2010-08-12T08:14:24.310 に答える
0

この点で 10.5 と 10.6 が異なる理由はわかりませんがmouseDownCanMoveWindow、次の質問のようにオーバーライドして NO を返すようにしてください。

NSView サブクラスのマウス クリック イベント

于 2010-08-12T05:33:35.140 に答える