[Obj-C++] 08 Drag & Dropの検証 (非Xib環境)

[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

参考サイト