Получение событий перетаскивания в NSWindow, когда окно содержит одно представление WebView - PullRequest
0 голосов
/ 16 августа 2011

Я новичок в объективе-c и какао, поэтому, пожалуйста, разберитесь со мной.Я работаю над проектом, начатым другим разработчиком, и работаю в target-c только 3 дня.

У меня есть подкласс NSWindow, который содержит представление WebView.Загружаемый контент WebView является плагином Silverlight.Я зарегистрировал NSWindow для получения событий Drag.События перетаскивания генерируются, но только когда перетаскивание происходит в пределах строки заголовка NSWindow.Я регистрируюсь для событий перетаскивания в методе загрузки.

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;
}

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

WebView s являются одним из самых сложных видов в Какао и являются особым случаем, когда дело доходит до перетаскивания. Вместо реализации стандартного поведения перетаскивания NSView необходимо вместо этого установить объект в качестве веб-представления WebUIDelegate и реализовать следующий метод делегата:

‑webView:dragDestinationActionMaskForDraggingInfo:

Затем вы можете управлять тем, как веб-представление реагирует на действие перетаскивания. Протокол WebUIDelegate имеет несколько других способов управления перетаскиванием, поэтому вы должны прочитать документацию для получения более подробной информации.

Чтобы на самом деле получать перетаскиваемые объекты и обрабатывать их, вам нужно создать подкласс WebView и реализовать ‑draggingEnded:.

Вы определенно не должны добавлять любые методы перетаскивания в само окно.

0 голосов
/ 16 августа 2011

Я думаю, вы получаете события перетаскивания в строке заголовка, потому что вы зарегистрировали окно для получения событий, а не веб-представление .

Попробуйте вместо этого:

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