[Obj-C++] 16 NSWindowの重複 : 解決手順2

[M1 Mac, Big Sur 11.6.5, clang 13.0.0, no Xcode]

前回の続きです。

AppDelegateファイルを作成以降は以下の流れになります。

1.Drag & Dropを設定しているNSViewクラスのconcludeDragOperationメソッドにDropしたファイルのパスについて処理内容を記述する。
2.NSAppクラスのorderedWindowsメソッドでNSWindowの配列をディスプレイ表示順にて取得する。
3.先頭のNSWindowを選択し、setIsVisibleメソッドで非表示に設定する。
4.[alloc init]で新しいNSWindowを作成する。
5.NSWindow内のTextFieldにファイルパスを入力する。

念のため消費メモリを確認しましたが、特に異常はありませんでした。ただ何らかの弊害が発生する可能性はあります。

コードは以下の通りです。

<該当箇所のみ>

@implementation DragAndDropView

// ドロップ完了後の処理
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{
    NSPasteboard *pboard = [sender draggingPasteboard];
    NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];
    NSLog(@"fileURL %@",fileURL);

    // NSAppのWindowをディスプレイ表示順に並べた配列を作成
    NSArray *windowsArray = [NSApp orderedWindows];
    NSLog(@"windowsArray %@", windowsArray);

    // 先頭のWindowを非表示にする(操作しているため、このAppが常に先頭)
    NSWindow *currentWindow = [windowsArray objectAtIndex:0];
    [currentWindow setIsVisible:NO];

    //新たにAppのWindowを作成
    ConvertorWindow *newWindow = [[ConvertorWindow alloc] init];
    [[newWindow autorelease] makeMainWindow];

    // Window内のtextBox1にファイルパスを入力する
    newWindow->textBox1.stringValue = fileURL;
}
@end

参考サイト

[Obj-C++] 15 NSWindowの重複 : 解決手順1

[M1 Mac, Big Sur 11.6.5, clang 13.0.0, noXcode]

まずコードのメンテナンス性を高めてNSWindowを扱いやすくするため、mainクラスからAppDelegateクラスへNSWindowの起動時初期化を委譲しました。

次回は具体的なソースコードの内容について書きます。

#import "AppDelegate.h"

int main(int argc, const char * argv[]) {
    auto app = [NSApplication sharedApplication];
    app.delegate = [AppDelegate new];
    [app run];
}
#import "AppDelegate.h"
#import "ConvertorWindow.h"
#import "DragAndDropView.h"

@interface AppDelegate()
@end

@implementation AppDelegate

- (void)applicationWillFinishLaunching:(NSNotification*)notification {
    [[[[ConvertorWindow alloc] init] autorelease] makeMainWindow];
    NSLog(@"%s","applicationWillFinishLaunching");
    
}

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    NSLog(@"%s","applicationDidFinishLaunching");
}


- (void)applicationWillTerminate:(NSNotification *)notification {
}


- (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app {
    return YES;
}
@end