SwiftUI를 사용하여 툴바를 macOS 앱에 추가하려면 어떻게합니까?


9

제목 표시 줄 안에 툴바를 SwiftUI를 사용하여 macOS 앱에 추가하려고합니다. 아래에 표시된 것과 유사합니다.

macOS 앱의 제목 표시 줄에있는 툴바

SwiftUI를 사용하여 이것을 달성하는 방법을 알 수 없습니다. 현재 뷰 안에 툴바 (텍스트 필드 만 있음)가 있지만 제목 표시 줄로 옮기고 싶습니다.

내 현재 코드 :

struct TestView: View {
    var body: some View {
        VStack {
            TextField("Placeholder", text: .constant("")).padding()
            Spacer()
        }
    }
}

따라서 필자의 경우 툴바 안에 텍스트 필드가 있어야합니다.


macOS 대상에서 SwiftUI를 이야기하고 있습니다.
Bijoy Thangaraj

macOS SwiftUI에서는 navigationBarTitle 수정자를 사용할 수 없습니다.
Bijoy Thangaraj

현재 SwiftUI에서는 툴바가 지원되지 않습니다. 정말로 필요한 이유 (왜?)를 AppKit에서 사용하면 여전히 있습니다.
Asperi

@ Asperi 나는 이것을 할 수있었습니다-아래 답변을 참조하십시오. 툴바 (또는 제목 표시 줄 액세서리)는 여전히 macOS 앱에서 널리 사용됩니까?
Bijoy Thangaraj

@Asperi AppKit의 앱을 사용하려면 NSToolbar에 NSViewRepresentable을 사용 했습니까? 그렇다면 그 방법을 시도했지만 성공하지 못했습니다. 그런 식으로 해결책이 있다면 그것을 확인하고 싶습니다.
Bijoy Thangaraj

답변:


4

접근법 1 :

제목 표시 줄 액세서리를 추가하면됩니다. AppDelegate.swift 파일을 수정 하여이 작업을 수행 할 수있었습니다. 제대로 보이도록 이상한 패딩을 적용해야했습니다.

AppDelegate.swift

func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Create the SwiftUI view that provides the window contents.
        let contentView = ContentView()

        // Create the titlebar accessory
        let titlebarAccessoryView = TitlebarAccessory().padding([.top, .leading, .trailing], 16.0).padding(.bottom,-8.0).edgesIgnoringSafeArea(.top)

        let accessoryHostingView = NSHostingView(rootView:titlebarAccessoryView)
        accessoryHostingView.frame.size = accessoryHostingView.fittingSize

        let titlebarAccessory = NSTitlebarAccessoryViewController()
        titlebarAccessory.view = accessoryHostingView       

        // Create the window and set the content view. 
        window = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
            styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
            backing: .buffered, defer: false)
        window.center()
        window.setFrameAutosaveName("Main Window")

        // Add the titlebar accessory
        window.addTitlebarAccessoryViewController(titlebarAccessory)

        window.contentView = NSHostingView(rootView: contentView)
        window.makeKeyAndOrderFront(nil)
    }

TitlebarAccessory.swift

import SwiftUI

struct TitlebarAccessory: View {
    var body: some View {

        TextField("Placeholder", text: .constant(""))

    }
}

결과:

macOS 툴바 내의 컨텐츠

접근법 2 (대체 방법) :

여기서 아이디어는 스토리 보드를 사용하여 도구 모음 부분을 만들고 SwiftUI를 사용하여 나머지 앱을 수행하는 것입니다. 스토리 보드를 사용자 인터페이스로 사용하여 새 앱을 만들면됩니다. 그런 다음 스토리 보드로 이동하여 기본 View Controller를 삭제하고 새을 추가하십시오 NSHostingController. 새로 추가 된 Hosting Controller를 관계를 설정하여 기본 창에 연결하십시오. 인터페이스 빌더를 사용하여 도구 모음을 창에 추가하십시오.

스토리 보드 구성

사용자 정의 클래스를 연결하고 NSHostingControllerSwiftUI보기를로드하십시오.

아래 예제 코드 :

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

    @objc required dynamic init?(coder: NSCoder) {
        super.init(coder: coder, rootView: SwiftUIView())       

    }

}

이 방법을 사용하면 도구 모음을 사용자 정의 할 수도 있습니다.


마우스 오른쪽 버튼을 클릭하고 "도구 모음 사용자 정의"를 선택하여 편집 할 수있는 방법이 있습니까? (파인더, 페이지 등과 유사)
sqwk

1
첫 번째 해결책으로는 아닙니다. 그러나 위의 응답에 추가 한 대안을 살펴보십시오. 그러면 툴바를 사용자 정의 할 수있는 옵션이 제공됩니다.
Bijoy Thangaraj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.