How to make TextField focus in SwiftUI for macOS

Issue #620 For NSWindow having levelother than .normal, need to override key and main property to allow TextField to be focusable class FocusWindow: NSWindow { override var canBecomeKey: Bool { true } override var canBecomeMain: Bool { true } } Furthermore to customize TextField, consider using custom import SwiftUI import AppKit struct MyTextField: NSViewRepresentable { @Binding var text: String func makeNSView(context: NSViewRepresentableContext<MyTextField>) -> NSTextField { let tf = NSTextField() tf.focusRingType = ....

March 13, 2020 · 1 min · Khoa Pham

How to show popover for item in ForEach in SwiftUI

Issue #618 Create custom Binding List { ForEach(self.items) { (item: item) in ItemRowView(item: item) .popover(isPresented: self.makeIsPresented(item: item)) { ItemDetailView(item: item) } } } func makeIsPresented(item: Item) -> Binding<Bool> { return .init(get: { return self.selectedId == item.id }, set: { _ in self.selectedId = nil }) } ...

March 11, 2020 · 1 min · Khoa Pham

How to make tooltip in SwiftUI for macOS

Issue #617 On macOS 11, we can use .help modifier to add tooltip Button() .help("Click here to open settings") If you support macOS 10.15, then create empty NSView and use as overlay. Need to updateNSView in case we toggle the state of tooltip import SwiftUI struct Tooltip: NSViewRepresentable { let tooltip: String func makeNSView(context: NSViewRepresentableContext<Tooltip>) -> NSView { let view = NSView() view.toolTip = tooltip return view } func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext<Tooltip>) { nsView....

March 11, 2020 · 1 min · Khoa Pham

How to make tab view in SwiftUI

Issue #614 struct MyTabView: View { @EnvironmentObject var preferenceManager: PreferenceManager var body: some View { VOrH(isVertical: preferenceManager.preference.position.isVertical) { OneTabView(image: "one", text: "One", tab: .one) OneTabView(image: "two", text: "Two", tab: .two) OneTabView(image: "three", text: "Three", tab: .three) Spacer() } } } struct OneTabView: View { @EnvironmentObject var preferenceManager: PreferenceManager let image: String let text: String let tab: Tab var selected: Bool { preferenceManager.preference.tab == tab } var body: some View { Button(action: { self....

March 2, 2020 · 1 min · Khoa Pham

How to present NSWindow modally

Issue #612 Use runModal This method runs a modal event loop for the specified window synchronously. It displays the specified window, makes it key, starts the run loop, and processes events for that window. (You do not need to show the window yourself.) While the app is in that loop, it does not respond to any other events (including mouse, keyboard, or window-close events) unless they are associated with the window....

March 2, 2020 · 1 min · Khoa Pham

How to use Picker with enum in SwiftUI

Issue #611 enum WindowPosition: String, CaseIterable { case left case top case bottom case right } Picker(selection: $preference.position, label: Text("Position")) { ForEach(WindowPosition.allCases, id: \.self) { Text($0.rawValue) } } ...

February 29, 2020 · 1 min · Khoa Pham

How to use visual effect view in NSWindow

Issue #610 Set NSVisualEffectView as contentView of NSWindow, and our main view as subview of it. Remember to set frame or autoresizing mask as non-direct content view does not get full size as the window let mainView = MainView() .environment(\.managedObjectContext, coreDataManager.container.viewContext) window = NSWindow( contentRect: .zero, styleMask: [.fullSizeContentView], backing: .buffered, defer: false ) window.titlebarAppearsTransparent = true window.center() window.level = .statusBar window.setFrameAutosaveName("MyApp") let visualEffect = NSVisualEffectView() visualEffect.blendingMode = .behindWindow visualEffect.state = ....

February 27, 2020 · 1 min · Khoa Pham

How to animate NSWindow

Issue #609 Use animator proxy and animate parameter var rect = window.frame rect.frame.origin.x = 1000 NSAnimationContext.runAnimationGroup({ context in context.timingFunction = CAMediaTimingFunction(name: .easeIn) window.animator().setFrame(rect, display: true, animate: true) }, completionHandler: { }) Updated at 2020-11-22 18:26:33...

February 23, 2020 · 1 min · Khoa Pham

How to find active application in macOS

Issue #608 An NSRunningApplication instance for the current application. NSRunningApplication.current The running app instance for the app that receives key events. NSWorkspace.shared.frontmostApplication  ...

February 22, 2020 · 1 min · Khoa Pham

How to compare for nearly equal in Swift

Issue #607 Implement Equatable and Comparable and use round struct RGBA: Equatable, Comparable { let red: CGFloat let green: CGFloat let blue: CGFloat let alpha: CGFloat init(_ red: CGFloat, _ green: CGFloat, _ blue: CGFloat, _ alpha: CGFloat) { self.red = red self.green = green self.blue = blue self.alpha = alpha } static func round(_ value: CGFloat) -> CGFloat { (value * 100).rounded() / 100 } static func == (left: RGBA, right: RGBA) -> Bool { let r = Self....

February 19, 2020 · 1 min · Khoa Pham