-
[macOS] 스토리보드 없이 사용하기/mac OS 🖥 2024. 5. 24. 20:30반응형
안녕하세요 아렉스입니다 🫡
어느덧 여름이 다가오네요 💦💦💦
오늘은 Appkit을 이용한 macOS 개발 시 스토리보드를 사용하지않는 법에 대해서 공유드리겠습니다.
SwiftUI를 이용해서 멀티플뢧폼으로 mac catalyst, mac os 지원이 가능해진 시대이지만,
마이그레이션이 아안되어 불가피하게, UIKit를 사용하게 되는 것처럼 Appkit를 사용하는 경우 또한 있습니다.
macOS 개발은 iOS 개발과 비슷한점도 있지만, 많은 차이점이 있었어요.
하지만, 적은 레퍼런스가 높은 입문 장벽을 구성한다고 생각해요. 많은 도움이 되었으면 좋겠습니다 !
mac OS 또한 스토리보드로 개발이 가능해요
개발이 친숙해진 이후로는 스토리보드의 편리성보다는, 코드베이스의 선호도가 올라가는 것 같아요.macOS 와 같이 친숙하지않은 플랫폼을 개발하려고자할 때, UI 오브젝트와 앱과 화면 구성에 대해서 시각적인 요소로 직관적이게 다가오는 점은 참 .. 장점이라고 느껴지는 것 같습니다.
프로젝트를 생성한 후에 보면 기존 iOS 프로젝트와 큰 차이가 없는 모습을 볼 수 있네요
프로젝트 생성시 기본적으로 3개의 Scene으로 구성되어 있는 것을 확인할 수 있네요.
스토리보드를 제거하고 코드베이스로 작업할시 기본적인 구성은 이 부분을 참조하면 될거같습니다.
2023.08.07 - [/iOS 📱] - [iOS] 스토리보드 없이 개발하기
iOS와 마찬가지로 info.plist 파일에서 Main 참조하는 것을 지워줍시다.
이제 실행해보면 아~무것도 실행되지않습니다.
이렇게 텅 빈 AppDelegate에 코드를 추가해줄건데요
import Cocoa @main class AppDelegate: NSObject, NSApplicationDelegate { private var window: NSWindow! func applicationDidFinishLaunching(_ aNotification: Notification) { window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 480, height: 270), styleMask: [.miniaturizable, .closable, .resizable, .titled], backing: .buffered, defer: false) window.center() window.title = "No Storyboard Window" window.makeKeyAndOrderFront(nil) } }
실행을 시켜도 설정해준 윈도우는 보이지않습니다.
스토리보드 파일은 NSApplication에 AppDelegate를 설정하는 파일이기도 해서
Main 스토리보드가 사라진 후에는 AppDelegate가 호출되지않습니다.
실행 가능한 Swift 코드는 최상위-수준 진입점(top-level entry point)을 나타내면 됩니다.
실행 가능하게 만들기 위해 컴파일 한 Swift 코드는 코드가 파일과 모듈로 구성되는 방식과 상관없이 최상위-수준 진입점을 나타내는 다음 접근 방식 중 하나만 포함할 수 있습니다:
- main 속성
- NSApplicationMain 속성
- UIApplicationMain 속성
- main.swift 파일 또는 최상위-수준 실행 가능한 코드를 포함하는 파일.
@main 속성과 main.swift 활용하는 2가지 방법을 소개하겠습니다.
@main 속성
@main class AppDelegate: NSObject, NSApplicationDelegate { private var window: NSWindow! static func main() { let app = NSApplication.shared let delegate = AppDelegate() app.delegate = delegate // 1. run() 메서드 이용 app.run() // 2. NSApplicationMain 메서드 이용 // _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) } }
1번 run(), 2번 NSApplicationMain 두가지 중 하나를 선택해서 응용프로그램을 실행할 수 있습니다.저는 run() 메서드를 사용하는 것을 추천드립니다 ..!
두 메서드는은 실제로 동일한 동작을 합니다만, main의 아규먼트를 사용할 일은 없지만, NSApplicationMain의 경우 UnsafeMutablePointer 타입를 사용하기에, 포인터를 사용하게되고, 핸들링할 자신이 없다면 동일한 일을 수행하는 run()을 사용하는게 좋다고 생각합니다.
차이점이나 틀린 부분이 있다면 댓글에 남겨주시면 감사하겠습니다 !
main.swift 파일 만들기
AppDelegate의 @main 을 주석처리 혹은 지워주세요
main.swift 파일을 생성합니다.
// // main.swift // // Created by 아렉스 on 5/24/24. // import Cocoa let app = NSApplication.shared let delegate = AppDelegate() app.delegate = delegate app.run() // _ = NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) /* argc, argv와 argv가 무엇을 뜻하는지 궁금하시면 주석을 풀어 직접 확인해보시는 걸 추천드립니다 ! let argc = CommandLine.argc let unsafeArgv = CommandLine.unsafeArgv let cString = String(cString: unsafeArgv.pointee!) print(argc, unsafeArgv) print(cString) _ = NSApplicationMain(argc, unsafeArgv) */
그럼 스토리보드 없는 세팅을 마칠 수가 있습니다 !
참고자료
https://sarunw.com/posts/how-to-create-macos-app-without-storyboard/
https://bbiguduk.gitbook.io/swift/language-reference/attributes#main
https://bbiguduk.gitbook.io/swift/language-reference/declarations#top-level-code
' > mac OS 🖥' 카테고리의 다른 글
[macOS] NSWindow.StyleMask 종류 알아보기 (0) 2024.06.27 CPU 온도 확인해보기 (1) 2023.11.02 [문제해결] xcrun: error: invalid active developer path (0) 2023.11.02 [macOS] uname 명령어 사용법 (0) 2023.08.13 [macOS] Darwin은 무엇일까 ? (0) 2023.08.13