[M1 Mac, Big Sur 11.6.5, clang 13.0.0, no Xcode]
Drag & Dropに関連するメソッドの動作を確認するため検証用コードを作成しました。
Window全体をドロップ領域のNSViewに設定してもうまくいかないので、オレンジ色の部分をドロップ領域にしました。ファイルのURLをペーストします。
Xcodeを使わずInterfaceBuilderやXibなしでDrag & Dropができるかどうか不安でしたが杞憂でした。
あとはドロップ対象をWindow全体に変更して完了です。
2022/6/8追記:
NSViewの設定がうまくいかなかったのは相対座標ではなく絶対座標でWindowと同じ設定をしていたためでした。
#import "AppDelegate.h"
#import "DragAndDropView.h"
#import "XlsxConvertor.h"
@interface DragAndDropView ()
@property (nonatomic) BOOL highlight;
@end
@implementation DragAndDropView
// 初期化時の処理
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setHighlight:NO];
[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeFileURL]];
}
NSLog(@"%s","initWithFrame");
return self;
}
// Viewの描画処理
- (void)drawRect:(NSRect)rect{
[super drawRect:rect];
if (_highlight) {
[[NSColor systemBlueColor] set];
[NSBezierPath setDefaultLineWidth: 5];
[NSBezierPath strokeRect: [self bounds]];
} else {
[[NSColor grayColor] set];
[NSBezierPath setDefaultLineWidth: 1];
[NSBezierPath strokeRect: [self bounds]];
}
}
// view内にファイルがドラッグされた時の処理
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
[self setHighlight:YES];
[self setNeedsDisplay: YES];
NSLog(@"%s","draggingEntered");
return NSDragOperationCopy;
}
// ドラッグ中の処理
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
[self setHighlight:YES];
[self setNeedsDisplay: YES];
return NSDragOperationGeneric;
}
// view外に出た時の処理
- (void)draggingExited:(id <NSDraggingInfo>)sender{
[self setHighlight:NO];
[self setNeedsDisplay: YES];
NSLog(@"%s","draggingExited");
}
// ドロップ時の処理
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender {
[self setHighlight:NO];
[self setNeedsDisplay: YES];
NSLog(@"%s","prepareForDragOperation");
return YES;
}
// ドロップ後の処理
- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender {
NSLog(@"%s","performDragOperation kaishi");
NSArray *draggedFilenames = [[sender draggingPasteboard] propertyListForType:NSPasteboardTypeFileURL];
NSLog(@"draggedFilenames %@",draggedFilenames);
return YES;
}
// ドロップ完了後の処理
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
NSArray *filePaths = [[sender draggingPasteboard] propertyListForType:NSPasteboardTypeFileURL];
NSLog(@"filePaths %@",(NSString*)filePaths);
ConvertorWindow *win= [[ConvertorWindow alloc] init];
win -> textBox1.stringValue = (NSString*)filePaths;
NSLog(@"%s","concludeDragOperation kanryou");
}
@end
参考サイト