আমি কীভাবে সুইফটইউআই ব্যবহার করে কোনও ম্যাকস অ্যাপে একটি সরঞ্জামদণ্ড যুক্ত করব?


11

আমি সুইফটইউআই ব্যবহার করে শিরোনাম বারের ভিতরে একটি ম্যাকস অ্যাপ্লিকেশনটিতে একটি সরঞ্জামদণ্ড যুক্ত করার চেষ্টা করছি, যা নীচে দেখানো হয়েছে তার অনুরূপ something

ম্যাকোস অ্যাপ্লিকেশনে শিরোনামবারের সরঞ্জামদণ্ড

আমি সুইফটইউআই ব্যবহার করে এটি অর্জনের কোনও উপায় বের করতে অক্ষম। বর্তমানে আমার কাছে আমার ভিউয়ের ভিতরে আমার সরঞ্জামদণ্ডটি রয়েছে (যার কেবলমাত্র একটি পাঠ্য ক্ষেত্র রয়েছে) তবে আমি এটি শিরোনাম বারে স্থানান্তরিত করতে চাই।

আমার বর্তমান কোড:

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

সুতরাং, আমার ক্ষেত্রে, সরঞ্জামদণ্ডের ভিতরে আমার পাঠ্যক্ষেত্র থাকা উচিত।


আমি ম্যাকোস টার্গেটে সুইউটইউআইয়ের কথা বলছি।
বিজয় থানগরাজ

না, নেভিগেশনবার্টিটাল সংশোধক ম্যাকস সুইফটুআইতে উপলভ্য নয়।
বিজয় থানগরাজ

আপাতত সরঞ্জামদণ্ডটি সুইফটুইতে সমর্থিত নয়। আপনার যদি সত্যিই একটি প্রয়োজন হয় (কেন?) তবে অ্যাপকিট থেকে একটি ব্যবহার করুন, এটি এখনও রয়েছে ... সত্যিই।
আস্পেরি

@ এস্পেরি আমি এটি করতে সক্ষম হয়েছি - নীচের উত্তরটি দেখুন। সরঞ্জামদণ্ডগুলি (বা শিরোনাম বার আনুষাঙ্গিক) এখনও ম্যাকস অ্যাপ্লিকেশনগুলিতে ব্যাপকভাবে ব্যবহৃত হয়, তাই না?
বিজয় থানগরাজ

@ এস্পেরি অ্যাপকিট থেকে একটিটি ব্যবহার করার জন্য, আপনি কি এনএসটিউলবার্পেসেটিভ এনএসটিউলবার ব্যবহার করার অর্থ দিয়েছেন? যদি তা হয় তবে আমি সেই পদ্ধতিটি চেষ্টা করেছিলাম তবে সফল হয়নি। আপনার যদি সেইভাবে সমাধান হয় তবে আমি এটি পরীক্ষা করে দেখতে পছন্দ করব।
বিজয় থানগরাজ

উত্তর:


6

পন্থা 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(""))

    }
}

ফলাফল:

ম্যাকোস সরঞ্জামদণ্ডের ভিতরে সামগ্রী

পদ্ধতির 2 (বিকল্প পদ্ধতি):

এখানে ধারণাটি হ'ল স্টোরিবোর্ড ব্যবহার করে সরঞ্জামদণ্ডের অংশটি করা এবং বাকী অ্যাপটি সুইফটইউআই ব্যবহার করে। এটি ব্যবহারকারী ইন্টারফেস হিসাবে স্টোরিবোর্ড সহ একটি নতুন অ্যাপ্লিকেশন তৈরি করে করা হয়। তারপরে স্টোরিবোর্ডে যান এবং ডিফল্ট ভিউ কন্ট্রোলার মুছুন এবং একটি নতুন যুক্ত করুন NSHostingController। নতুন যুক্ত হওয়া হোস্টিং কন্ট্রোলারটিকে তার সম্পর্ক স্থাপন করে মূল উইন্ডোতে সংযুক্ত করুন। ইন্টারফেস বিল্ডার ব্যবহার করে উইন্ডোতে আপনার সরঞ্জামদণ্ডটি যুক্ত করুন।

স্টোরিবোর্ড কনফিগারেশন

আপনার সাথে একটি কাস্টম শ্রেণি সংযুক্ত করুন NSHostingControllerএবং এতে আপনার সুইফটুআই ভিউ লোড করুন।

নীচের উদাহরণ কোড:

import Cocoa
import SwiftUI

class HostingController: NSHostingController<SwiftUIView> {

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

    }

}

এই পদ্ধতির ব্যবহার আপনাকে সরঞ্জামদণ্ডটি কাস্টমাইজ করার ক্ষমতাও দেয়।


ডান ক্লিক করে এবং "কাস্টমাইজ টুলবারটি" নির্বাচন করে এটিকে সম্পাদনযোগ্য করার কোনও উপায় আছে কি? (সন্ধানকারী, পৃষ্ঠাগুলি ইত্যাদির অনুরূপ)
স্কোরওয়াক

2
প্রথম সমাধান সহ, না। তবে, উপরে আমার প্রতিক্রিয়াতে আমি যুক্ত বিকল্প পদ্ধতির দিকে নজর দিন। এইভাবে, আপনি সরঞ্জামদণ্ডটি কাস্টমাইজ করার বিকল্প পাবেন।
বিজয় থানগরাজ

@ বিজয়থংরাজ কীভাবে টুলবারে একটি বোতাম ব্যবহার করে Stateভেরিয়েবল পরিবর্তন করবেন SwiftUIView? আমি চেষ্টা করেছি কিন্তু রাষ্ট্র পরিবর্তন হয় না।
অ্যালান

@ অ্যালান, এটির একটি উপায় হ'ল আপনার উইন্ডো কনট্রোলার থেকে একটি বিজ্ঞপ্তি পোস্ট করা যা আপনি আপনার হোস্টিংকন্ট্রোলারে লক্ষ্য রাখতে পারেন। আপনার হোস্টিংকন্ট্রোলারে, আপনি একটি পর্যবেক্ষণযোগ্য অবজেক্টটি ধরে রাখতে পারেন এবং প্রাপ্ত নোটিফিকেশনের ভিত্তিতে এর বৈশিষ্ট্যগুলি সংশোধন করতে পারেন। শেষ অবধি, আপনি এই পর্যবেক্ষণযোগ্য অবজেক্টটি আপনার সুইফটউআইভিউতে এইভাবে পাঠাতে পারেন:super.init(coder: coder, rootView: AnyView(SwiftUIView().environmentObject(myObservableObject)))
বিজয়

-1

ইউআইকিট + অনুঘটক

https://developer.apple.com/documentation/uikit/uititlebar

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let windowScene = (scene as? UIWindowScene) else { return }
        let window = UIWindow(windowScene: windowScene)

        if let titlebar = windowScene.titlebar {

            //toolbar
            let identifier = NSToolbar.Identifier(toolbarIdentifier)
            let toolbar = NSToolbar(identifier: identifier)
            toolbar.allowsUserCustomization = true
            toolbar.centeredItemIdentifier = NSToolbarItem.Identifier(rawValue: centerToolbarIdentifier)
            titlebar.toolbar = toolbar
            titlebar.toolbar?.delegate = self

            titlebar.titleVisibility = .hidden
            titlebar.autoHidesToolbarInFullScreen = true
        }

        window.makeKeyAndVisible()

    }
#if targetEnvironment(macCatalyst)
let toolbarIdentifier = "com.example.apple-samplecode.toolbar"
let centerToolbarIdentifier = "com.example.apple-samplecode.centerToolbar"
let addToolbarIdentifier = "com.example.apple-samplecode.add"

extension SceneDelegate: NSToolbarDelegate {

    func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
        if itemIdentifier == NSToolbarItem.Identifier(rawValue: toolbarIdentifier) {
            let group = NSToolbarItemGroup(itemIdentifier: NSToolbarItem.Identifier(rawValue: toolbarIdentifier), titles: ["Solver", "Resistance", "Settings"], selectionMode: .selectOne, labels: ["section1", "section2", "section3"], target: self, action: #selector(toolbarGroupSelectionChanged))

            group.setSelected(true, at: 0)

            return group
        }

        if itemIdentifier == NSToolbarItem.Identifier(rawValue: centerToolbarIdentifier) {
            let group = NSToolbarItemGroup(itemIdentifier: NSToolbarItem.Identifier(rawValue: centerToolbarIdentifier), titles: ["Solver1", "Resistance1", "Settings1"], selectionMode: .selectOne, labels: ["section1", "section2", "section3"], target: self, action: #selector(toolbarGroupSelectionChanged))

            group.setSelected(true, at: 0)

            return group
        }

        if itemIdentifier == NSToolbarItem.Identifier(rawValue: addToolbarIdentifier) {
            let barButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.add, target: self, action: #selector(self.add(sender:)))
            let button = NSToolbarItem(itemIdentifier: itemIdentifier, barButtonItem: barButtonItem)
            return button
        }

        return nil
    }

    @objc func toolbarGroupSelectionChanged(sender: NSToolbarItemGroup) {
        print("selection changed to index: \(sender.selectedIndex)")
    }

    @objc func add(sender: UIBarButtonItem) {
        print("add clicked")
    }

    func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        [NSToolbarItem.Identifier(rawValue: toolbarIdentifier), NSToolbarItem.Identifier(rawValue: centerToolbarIdentifier), NSToolbarItem.Identifier.flexibleSpace,
            NSToolbarItem.Identifier(rawValue: addToolbarIdentifier),
            NSToolbarItem.Identifier(rawValue: addToolbarIdentifier)]
    }

    func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
        self.toolbarDefaultItemIdentifiers(toolbar)
    }

}
#endif
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.