首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在基础窗口上活动的NSTabView阻塞文件删除事件。

在基础窗口上活动的NSTabView阻塞文件删除事件。
EN

Stack Overflow用户
提问于 2015-08-19 05:39:31
回答 2查看 131关注 0票数 0

我已经成功地在我的应用程序中实现了一个文件删除功能。应用程序窗口中有几个NSTabView对象,在这些对象上放置不起作用。在窗口的任何其他地方,文件拖放都能正常工作。

我试图让应用程序代表NSTabView,但这没有帮助。

有人为NSTabView设置了不过滤掉删除操作的设置,这样整个窗口就可以对文件删除操作透明了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-24 16:24:02

对于一个比olekeh更通用的解决方案,我使它对IB友好,这样您就可以将它连接到符合NSDraggingDestination协议的任何对象。

代码语言:javascript
复制
#import <Cocoa/Cocoa.h>

@interface DropFilesView : NSView

@property (nullable, assign) IBOutlet id<NSDraggingDestination> dropDelegate;

@end

@implementation DropFilesView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
}

-(void) awakeFromNib {
    [self registerForDraggedTypes:
  [NSArray arrayWithObjects:NSFilenamesPboardType,
  (NSString *)kPasteboardTypeFileURLPromise,kUTTypeData, NSURLPboardType, nil]]; //kUTTypeData
    [super awakeFromNib];
}

-(NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender{
    return [self.dropDelegate draggingEntered:sender];
}


- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender {
    return [self.dropDelegate performDragOperation:sender];
}

@end
票数 1
EN

Stack Overflow用户

发布于 2015-08-21 21:36:44

我找到了解决这个问题的方法!-我把它发到这里给其他可能需要的人。

NSTabView对象对于其每个选项卡都有一个NSTabViwItem。在每一种情况下,都有一个常规的NSView (我用以下代码对其进行子类划分):--代码假定您的AppDelegate中已经有"draggingEntered“和"performDragOperation”,因为这个类只是将这些消息转发给应用程序委托。您还需要将这些方法的声明放在AppDelegate.h中。

代码语言:javascript
复制
//  DropFilesView.h
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"

@interface DropFilesView : NSView

@end

以及执行情况:

代码语言:javascript
复制
//  DropFilesView.m
#import "DropFilesView.h"

@implementation DropFilesView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
}

-(void) awakeFromNib {
    [self registerForDraggedTypes:
      [NSArray arrayWithObjects:NSFilenamesPboardType,
      (NSString *)kPasteboardTypeFileURLPromise,kUTTypeData, NSURLPboardType, nil]]; //kUTTypeData
    [super awakeFromNib];
}

-(NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender
{
    AppDelegate*   del = [AppDelegate sharedAppDelegate];
    return [del draggingEntered:sender];
}


- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender {

    AppDelegate*   del = [AppDelegate sharedAppDelegate];
    return [del performDragOperation:sender];
}

@end

在Interfacebuilder中,我将所有NSView对象的新类设置为这个新类,该类涵盖了拖放不起作用的区域。

NSImageView和WebView类也可以使用类似的方法。但是,对于最后一个,不要使用超级awakeFromNib来防止对web视图对象的默认拖放处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32087324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档