Làm cách nào để thêm thanh công cụ vào ứng dụng macOS bằng SwiftUI?


9

Tôi đang cố gắng thêm thanh công cụ bên trong thanh tiêu đề vào ứng dụng macOS bằng SwiftUI, một cái gì đó tương tự như những gì được hiển thị bên dưới.

Thanh công cụ trong thanh tiêu đề trong ứng dụng macOS

Tôi không thể tìm ra cách để đạt được điều này bằng SwiftUI. Hiện tại, tôi có thanh công cụ của mình (chỉ có một trường văn bản) trong chế độ xem của tôi, nhưng tôi muốn di chuyển nó vào thanh tiêu đề.

Mã hiện tại của tôi:

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

Vì vậy, trong trường hợp của tôi, tôi cần phải có trường văn bản bên trong thanh công cụ.


Tôi đang nói về SwiftUI trong mục tiêu macOS.
Bijoy Thangaraj

Không, công cụ sửa đổi navigationBarTitle không có sẵn trong macOS SwiftUI.
Bijoy Thangaraj

Hiện tại thanh công cụ không được hỗ trợ trong SwiftUI. Nếu bạn thực sự cần một (tại sao?) Thì hãy sử dụng một từ AppKit, nó vẫn ở đó ... thực sự.
Asperi

@Asperi Tôi đã có thể làm điều này - vui lòng xem câu trả lời dưới đây. Thanh công cụ (hoặc phụ kiện thanh tiêu đề) vẫn được sử dụng rộng rãi trong các ứng dụng macOS, phải không?
Bijoy Thangaraj

@Asperi Để sử dụng ứng dụng từ AppKit, ý bạn là sử dụng NSViewRepftimeable cho NSToolbar? Nếu vậy, tôi đã thử phương pháp đó nhưng không thành công. Nếu bạn có một giải pháp theo cách đó, tôi rất thích kiểm tra nó.
Bijoy Thangaraj

Câu trả lời:


4

Cách tiếp cận 1:

Điều này được thực hiện bằng cách thêm một phụ kiện thanh tiêu đề. Tôi đã có thể thực hiện điều này bằng cách sửa đổi tệp AppDelegate.swift. Tôi đã phải áp dụng một số phần đệm kỳ lạ để làm cho nó trông đúng.

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(""))

    }
}

Kết quả:

Nội dung bên trong thanh công cụ macOS

Cách tiếp cận 2 (Phương pháp thay thế):

Ý tưởng ở đây là thực hiện phần thanh công cụ bằng bảng phân cảnh và phần còn lại của ứng dụng bằng SwiftUI. Điều này được thực hiện bằng cách tạo một ứng dụng mới với bảng phân cảnh là giao diện người dùng. Sau đó, đi đến bảng phân cảnh và xóa Trình điều khiển xem mặc định và thêm một cái mới NSHostingController. Kết nối Bộ điều khiển Hosting mới được thêm vào cửa sổ chính bằng cách đặt mối quan hệ của nó. Thêm thanh công cụ của bạn vào cửa sổ bằng cách sử dụng trình xây dựng giao diện.

Cấu hình cốt truyện

Đính kèm một lớp tùy chỉnh cho bạn NSHostingControllervà tải chế độ xem SwiftUI của bạn vào đó.

Mã ví dụ dưới đây:

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

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

    }

}

Sử dụng phương pháp này cũng cung cấp cho bạn khả năng tùy chỉnh thanh công cụ.


Có cách nào để làm cho nó có thể chỉnh sửa bằng cách nhấp chuột phải và chọn "Tùy chỉnh Thanh công cụ" không? (Tương tự như Finder, Pages, v.v.)
sqwk

1
Với giải pháp đầu tiên, không. Nhưng, hãy nhìn vào cách tiếp cận khác mà tôi đã thêm vào phản hồi của mình ở trên. Bằng cách đó, bạn có tùy chọn để tùy chỉnh thanh công cụ.
Bijoy Thangaraj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.