🎉 macOS 프로젝트 시작
디테일한 커스텀을 위해서는 SwiftUI 기반보단 Storyboard 기반으로 프로젝트를 생성하는 것이 맞다고 느껴졌다.
다음과 같이 프로젝트가 만들어졌다! macOS 앱은 import Cocoa가 기본으로 보였다. Cocoa는 AppKit, Foundation 등 여러 프레임워크가 포함된 프레임워크라고 한다. AppKit에서 NSView, NSViewController 등의 NS가 보이는데 이것은 macOS의 전신인 NeXTSTEP 운영체제에서 유래되었다고 한다. (아직 AppKit조차 제대로 모르는 상황에서는 이정도만 딱 아는게 맞다고 생각했다)
어쨋든 아래와 같은 앱이 보이게 되고,
내 mac으로 빌드를 해보면 위와같이 window가 뜨게 된다.
하지만 나는 우선 이런 창이 필요가 없는 앱이다. (상단의 메뉴로 설정이 가능하게 할 예정이다) 또한 윈도우가 화면 전체를 차지하기 때문에 윈도우를 디테일하게 조정해줘야 한다. 따라서 Storyboard는 필요가 없다고 느꼈다.
🧑🏻💻 코드베이스로 만들어보기
생각보다 코드베이스로 어떻게 하는지에 대한 정보가 없었어서 한참 인터넷을 뒤지다가 방법을 찾게되어 이렇게 작성을 하게 되었다.
1️⃣ Main 지우기, info.plist 항목 제거
Main.storyboard를 delete해준다.
info.plist에서 Main storyboard file base name (macOS) 부분을 과감하게 지워준다!
Run은 되지만 당연히 빈 아이콘말고는 아무것도 안보이게 된다.
2️⃣ 앱 진입 코드 작성
storyboard를 가지고 있다면 window를 만들어주지만 이제는 window가 없기 때문에 당연히 아무 화면도 나오지 않게 된다. AppDelegate쪽으로 가주자.
아래와 같이 window를 넣어준다.
import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
private var window: NSWindow?
func applicationDidFinishLaunching(_ aNotification: Notification) {
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 240, height: 240),
styleMask: [.miniaturizable, .closable, .resizable, .titled],
backing: .buffered, defer: false)
window?.title = "Initial Window"
window?.makeKeyAndOrderFront(nil)
}
func applicationWillTerminate(_ aNotification: Notification) { }
func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
return true
}
}
뭔가 될거같아서 Run을 해보지만... 아니 안되잖아요....
브레이크 포인트를 찍어보니 applicationDidFinishLaunching 자체가 실행이 안된다...
왜일까? 내가 찾은 이유는 @main으로 부족하다는 것이다. NSApplication으로 AppDelegate가 지정되어야 하는데 @main 만으로는 부족한듯 보인다.
혹시몰라서 @NSApplicationMain으로도 해봤지만 소용이 없었다...
3️⃣ main.swift 생성하기
AppDelegate를 NSApplication으로 설정해 줘야 한다는 것을 알았다. 우선 @main을 지워주고...
아래와 같이 main 파일을 만들어 줬다.
import Cocoa
let application = NSApplication.shared
let delegate = AppDelegate()
application.delegate = delegate
application.run()
그랬더니 내가 만든 window가 나오는 것을 볼 수 있었다.
3️⃣ AppDelegate에 main()함수 만들기
아래와 같이 main함수를 만들어줘도 실행이 된다.
@main
class AppDelegate: NSObject, NSApplicationDelegate {
static func main() {
let application = NSApplication.shared
let delegate = AppDelegate()
application.delegate = delegate
application.run()
}
//... applicationDidFinishLaunching 로직
}
'→ Pointer' 카테고리의 다른 글
[Project-Pointer] macOS 앱 개발 (2) | 2024.12.11 |
---|