gpt4 book ai didi

xcode - Cocoa 中的拖放 () 不起作用

转载 作者:行者123 更新时间:2023-12-03 16:23:41 25 4
gpt4 key购买 nike

我想在我的 Mac 应用程序中实现一些“简单”的拖放操作。我拖入一个 View 并相应地在我的 nib 文件中输入“MyView”。但是,我在控制台中没有收到任何响应(每当触发任何协议(protocol)方法时,我都会尝试记录消息)

我像这样子类化了 NSView:

@interface MyView : NSView <NSDraggingDestination>{
NSImageView* imageView;
}

并像这样实现它:

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {

[self registerForDraggedTypes:[NSImage imagePasteboardTypes]];

NSRect rect = NSMakeRect(150, 0, 400, 300);
imageView = [[NSImageView alloc] initWithFrame:rect];

[imageView setImageScaling:NSScaleNone];
[imageView setImage:[NSImage imageNamed:@"test.png"]];
[self addSubview:imageView];



}

return self;
}


- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
NSLog(@"entered");
return NSDragOperationCopy;

}

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
return NSDragOperationCopy;

}


- (void)draggingExited:(id <NSDraggingInfo>)sender{
NSLog(@"exited");

}
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender{
NSLog(@"som");
return YES;

}

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

NSPasteboard *pboard = [sender draggingPasteboard];

if ( [[pboard types] containsObject:NSURLPboardType] ) {
NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
NSLog(@"%@", fileURL);
}
return YES;
}

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
NSLog(@"conclude sth");


}

- (void)draggingEnded:(id <NSDraggingInfo>)sender{
NSLog(@"ended");


}

- (BOOL)wantsPeriodicDraggingUpdates{
NSLog(@"wants updates");

}


- (void)updateDraggingItemsForDrag:(id <NSDraggingInfo>)sender NS_AVAILABLE_MAC(10_7){
}

最佳答案

如果有人仍然需要这个,请使用:

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

而不是:

[self registerForDraggedTypes: 
[NSImage imagePasteboardTypes]]; // BAD: dropped image runs away, no draggingdestination protocol methods sent...

帮我解决了这个问题。我怀疑这有效,因为我的 XIB 的目标是 osX 10.5。 NSFilenamesPboardType 表示 10.5 及之前的“标准数据”UTI,[NSImage imagePasteboardTypes] 返回 10.6 及之后的标准数据 UTI。

顺便说一句,在 - (BOOL)performDragOperation:(id NSDraggingInfo)sender 中,您可以获取已删除文件的路径:

 NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];

在这里找到解决方案:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DragandDrop/Tasks/acceptingdrags.html#//apple_ref/doc/uid/20000993-BABHHIHC

关于xcode - Cocoa 中的拖放 (<NSDraggingDestination>) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com