2011-08-16 4 views
0

私はobjective-cとcocoaを初めて使用しています。私は別の開発者によって開始されたプロジェクトに取り組んでおり、3日間だけobjective-cで作業していました。ウィンドウに単一のWebViewビューが含まれている場合に、NSWindowでドラッグイベントを受け取ります。

WebViewビューを含むNSWindowサブクラスがあります。ロードされるWebViewコンテンツはSilverlightプラグインです。ドラッグイベントを受け取るためにNSWindowを登録しました。ドラッグイベントは生成されていますが、ドラッグがNSWindowタイトルバー内で発生した場合にのみ発生します。私は、loadメソッドでドラッグイベントを登録します。

AdminWindow.mm

#import "AdminWindow.h" 
#import "NativeMessageReceiver.h" 

extern AdminWindow* adminRiaWindow; 

@implementation AdminWindow 

@synthesize adminWebView; 

BOOL isAdminContentLoaded; 


-(void) load 
{ 
    if (!isAdminContentLoaded) 
    { 
     NSLog(@"loading Admin window"); 

     NSString *curDir = [[NSBundle mainBundle] bundlePath]; 
     NSString* url = [NSString stringWithFormat: @"file://%@/Contents/Resources/RIA/AdminContentMac.html",curDir]; 

     [[adminWebView mainFrame] loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url]]]; 
     [adminWebView setDrawsBackground:NO]; 

     id win = [adminWebView windowScriptObject]; 
     NativeMessageReceiver* receiver = [NativeMessageReceiver getInstance]; 
     [win setValue:receiver forKey:@"NativeMessageReceiver"]; 
     receiver.adminWebView = adminWebView; 

     isAdminContentLoaded = YES; 
    } 
}  

-(void) show 
{ 
    [self load];   

    [self setIsVisible: YES]; 

    [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
    [self makeKeyAndOrderFront: self]; 
    [self makeMainWindow]; 
    [self center]; 
} 

-(void) hide 
{ 
    [self setIsVisible: NO]; 
} 

- (BOOL) windowShouldClose : (id) sender 
{ 
    [self setIsVisible: NO]; 

    return NO; 
} 

- (BOOL) canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL) canBecomeMainWindow 
{ 
    return YES; 
} 

@end 

extern "C" void ShowAdminWindow() 
{ 
    NSLog(@"showing Admin window"); 
    if (![NSThread isMainThread]) 
     [adminRiaWindow performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 
    else 
    { 
     [adminRiaWindow show]; 
    } 
} 

extern "C" void HideAdminWindow() 
{ 
    if (![NSThread isMainThread]) 
    { 
     [adminRiaWindow performSelectorOnMainThread:@selector(hide) withObject:nil waitUntilDone:YES]; 
    } 
    else 
    { 
     [adminRiaWindow hide]; 
    } 

} 

CustomeWebView

@implementation SteamPunkWebView 
- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     [self registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; 
     NSLog(@"In Custom View Init"); 
    } 
    return self; 
} 
+0

WebView上に透明なNSViewをレイヤーし、透明なビューでドラッグイベントを処理するのが最善の解決策です。 WebViewでNSViewをレイヤーする方法を理解するだけです。 – wheels53

答えて

0

私はあなたのイベントではなく、を受信するウィンドウを登録しているため、あなたが唯一のタイトルバーにドラッグイベントを取得していると思いますウェブビュー

代わりにこれを試してみてください:

[self.adminWebView registerForDraggedTypes:[NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; 
+0

上記のようにビューを登録すると、イベントはまったくありません。私は、WebViewのサブクラスが必要で、ウィンドウの代わりに適切なドラッグイベントハンドラを実装する必要があると思いますか? – wheels53

+0

はい、それは私に聞こえます。または、ドラッグイベントをウィンドウに転送するようにビューに依頼することもできます。似たようなレシピがあります:http://www.stone.com/The_Cocoa_Files/Ins_and_Outs_of_Drag_and_D.html – paulmelnikow

0

WebView sがココアの中で最も複雑なビューの一つであり、それがドラッグに来るとき特別なケースです。

‑webView:dragDestinationActionMaskForDraggingInfo:

あなたは、あなたがウェブビューが応答する方法を制御することができます。代わりに標準NSViewドラッグ動作を実装するのは、WebビューのWebUIDelegateとしてオブジェクトを設定して、次のデリゲートメソッドを実装する代わりに、必要がありますドラッグアクション。 WebUIDelegateプロトコルにはドラッグを制御するいくつかの方法がありますので、詳細はthe documentationをお読みください。

ドラッグされたオブジェクトを実際に受け取って処理するには、WebViewをサブクラス化し、‑draggingEnded:を実装する必要があります。

あなたは間違いなくではありません。では、ウィンドウ自体にドラッグ方法を追加する必要はありません。

+0

ドキュメントは、送信側Webビューを参照しているようです。私の状況では、私はFinderまたはWebView上のデスクトップからアイテムをドラッグしています。あなたの答えはまだ当てはまりますか? – wheels53

+0

はい。このメソッドは、Webビューからドラッグビューだけでなく、すべてのドラッグ操作で機能します。ドラッグ操作をさらにカスタマイズする必要がある場合は、もちろん、Webビューをサブクラス化し、NSWindowコードでオーバーライドしたさまざまなドラッグメソッドをオーバーライドできます。 –

+0

私はWebViewをサブクラス化するようにドラッグイベントを処理して転送する必要がありますが、initWithFrameメソッドが呼び出されているのを見ていません。上記の更新されたコードをご覧ください。 @noa – wheels53

関連する問題