Construct and manage a graphical, event-driven user interface for your macOS app using AppKit.

AppKit Documentation

Post

Replies

Boosts

Views

Activity

notification about change visible window
Hello, I am trying to get a notification about change visible (top) window on Desktop. I am using NSWorkspaceDidActivateApplicationNotification notification and it works fine except situation of minimize current active application. Nothing is posted in notification center if active window is minimized. Are there any way to get some notification about change top window which is currently displayed on Desktop? Thank you in advance for your help!
0
0
439
Feb ’24
Issue setting a folder icon on Synology NAS
I have code which uses NSWorkspace setIcon:forFile:options: to place icons on folders. The code works everywhere except on a Synology NAS. (QNAP works fine). The method returns failed regardless of the NSWorkspaceIconCreationOptions set on the call. I would have chalked this up to a driver issue except that the user can manually set the icons on the Finder's Get Info panel. This implies that there is another method that I'm missing. Any ideas as to what this is?
0
0
400
Feb ’24
How to detect the location of a mouseDown event using Swift?
How to detect the location of a mouseDown event using Swift? With the following code snippet, I get the error "Cannot find type 'NSEvent' in scope"? import SpriteKit func mouseDown(with event: NSEvent) { if let ourScene = GameScene(fileNamed: "GameScene") { let location = event.location(in: view) let node:SKNode = ourScene.atPoint(location) if (node.name == "creditsInfo") { showCredits() } } // if let ourScene } // mouseDown Anybody have a floodlight to shine on this very basic error?
5
0
1.1k
Feb ’24
NSTextList support in macOS 14
This WWDC video (https://developer.apple.com/videos/play/wwdc2022/10090/) shows using NSTextList in TextKit 2 on both iOS and macOS to create bulleted lists in UITextView and NSTextView, respectively. The sample code still works on iOS, but doesn't work on macOS Here's a screenshot from the wwdc talk: Here's the same sample code running on macOS 14.3: Anyone know how to make NSTextList work on macOS 14? Is this a regression, did something change with the api, or has the functionality been removed?
2
3
759
Feb ’24
Any way to use a SymbolEffect in an NSButton
Examples of using SymbolEffect in AppKit all seem to be in NSImageView, and look through APIs it seems that the only way to apply those effect animations outside of SwiftUI is indeed in an NSImageView. I have a NSStatusItem where I'm using an SF Symbol in the NSStatusBarButton title (subclass of NSButton) and was trying to figure out if there was a way to use a SymbolEffect there. If the image of an NSButton uses (used) an NSImageView under the hood, that used to hidden in the buttons cell. Seeing how cells seem to be inaccessible now, perhaps there isn't a NSImageView in there these days anyway. Can NSStatusBarButton titles be provided by a custom view, oh I'm guessing the deprecated view property is still operational, but if I'm trying to release to the Mac App Store, that as equally off-limits as an NSButtonCell would have been. Is there a non-deprecated way that will let me ship to the App Store?
1
2
872
Feb ’24
Crash When Clicking on Definition View Created by AppKit's showDefinition(for:at)
I'm encountering a crash issue in my macOS application when clicking on the view generated by AppKit's showDefinition(for:at) function. I'm seeking assistance to resolve this issue. Problem Description: I'm developing a macOS application where I utilize the showDefinition(for:at) function provided by AppKit to display the definition view of words. However, whenever I click on this view, the application crashes abruptly. Error Message: The crash log reveals the following error message: Fault: deferNSXPCInvocationOntoMainThread_block_invoke caught NSInternalInconsistencyException '_CPSSetFrontProcessWithOptions failed due to CGError -606 4294966690 fffffda2 (appIsDaemon)' Attempts Made: Tried wrapping relevant code blocks with DispatchQueue.main.async, suspecting a threading issue. Development Environment: macOS Version: 14.3.1 Xcode Version: 15.2 I've included a snippet of the function where the view is created: func showWordDefinition(selectedText: String) { DispatchQueue.main.async { let DefinitionWindow = NSWindow(contentRect: NSRect(origin: self.mouseLocation, size: NSSize(width: 1, height: 1)), styleMask: [.borderless], backing: .buffered, defer: false) DefinitionWindow.level = .floating guard let mainScreenFrame = NSScreen.main?.frame else { return } DefinitionWindow.contentView?.showDefinition(for: attributedString, at: pointInWindow) DefinitionWindow.orderFront(nil) } Potential Questions and Concerns: Could there be an issue related to UI transitions or the main thread? How exactly does the showDefinition(for:) process work internally? Maybe , the view's display level being raised when clicked? If anyone could provide any insights or guidance on resolving this issue, it would be greatly appreciated. Thank you!
0
0
262
Feb ’24
Crash When Clicking on Definition View Created by AppKit's showDefinition(for:at)
I'm encountering a crash issue in my macOS application when clicking on the view generated by AppKit's showDefinition(for:at) function. I'm seeking assistance to resolve this issue. Problem Description: I'm developing a macOS application where I utilize the showDefinition(for:at) function provided by AppKit to display the definition view of words. However, whenever I click on this view, the application crashes abruptly. Error Message: The crash log reveals the following error message: Fault: deferNSXPCInvocationOntoMainThread_block_invoke caught NSInternalInconsistencyException '_CPSSetFrontProcessWithOptions failed due to CGError -606 4294966690 fffffda2 (appIsDaemon)' Attempts Made: Tried wrapping relevant code blocks with DispatchQueue.main.async, suspecting a threading issue. Making the DefinitionWindow variable a global one to manually control its lifecycle Development Environment: macOS Version: 14.3.1 Xcode Version: 15 I've included a snippet of the function where the view is created: func ShowDefinition(selectedText : String) { DispatchQueue.main.async { let DefinitionWindow = NSWindow(contentRect: NSRect(origin: self.mouseLocation, size: NSSize(width: 1, height: 1)), styleMask: [.borderless], backing: .buffered, defer: false) DefinitionWindow.level = .floating guard let mainScreenFrame = NSScreen.main?.frame else { return } DefinitionWindow.contentView?.showDefinition(for: attributedString, at: pointInWindow) DefinitionWindow.orderFront(nil) } } Potential Questions and Concerns: Could there be an issue related to UI transitions or the main thread? How exactly does the showDefinition(for:at) process work internally? Maybe , the view's display level being raised when clicked caused conflict? If anyone could provide any insights or guidance on resolving this issue, it would be greatly appreciated. Thank you!
0
0
288
Feb ’24
Print dialog issues with objective-c projects on Sonoma
Hello, I have some older objective-c projects that are about creating reports of tables and gantt charts and printing those reports. They work fine on Ventura and BigSur, but after upgrading to Sonoma, I encountered some problems with the Print dialog and options. Specifically, the page preview is not working, and the Close button does not close the dialog and is not responsive. I have to force quit the app to exit the Print dialog. This makes it impossible to print my reports properly. I wonder if this is a bug with Sonoma or with objective-c, and if there is any workaround or fix for this issue. I appreciate any help or advice from the community or the Apple support team. Thank you.
0
0
487
Feb ’24
Crash When Clicking on Definition View Created by AppKit's showDefinition(for:at)
I'm encountering a crash issue in my macOS application when clicking on the view generated by AppKit's showDefinition(for:at) function. I'm seeking assistance to resolve this issue. **Problem Description: ** I'm developing a macOS application where I utilize the showDefinition(for:at) function provided by AppKit to display the definition view of words. However, whenever I click on this view, the application crashes abruptly. **Error Message: ** The crash log reveals the following error message: Fault: deferNSXPCInvocationOntoMainThread_block_invoke caught NSInternalInconsistencyException '_CPSSetFrontProcessWithOptions failed due to CGError -606 4294966690 fffffda2 (appIsDaemon)' Attempts Made: Tried wrapping relevant code blocks with DispatchQueue.main.async, suspecting a threading issue. Making the DefinitionWindow variable a global one to manually control its lifecycle Development Environment: macOS Version: 14.3.1 Xcode Version: 15 Below is a complete and reproducible code snippet that can be directly executed within a terminal project template. Please note that it requires Accessibility permissions to be granted in the Privacy settings. import Cocoa import SwiftUI import AppKit class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ notification: Notification) { NSEvent.addGlobalMonitorForEvents(matching: .keyDown) { [weak self] event in guard let self = self else { return } if event.modifierFlags.contains(.command) && event.charactersIgnoringModifiers == "c" { self.ShowWordDefinition() } } NSApp.servicesProvider = self NSApp.registerServicesMenuSendTypes([.string], returnTypes: []) } func ShowWordDefinition(){ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { let attributedString = NSAttributedString(string:NSPasteboard.general.string(forType: .string)!) let DefinitionWindow = NSWindow(contentRect: NSRect(origin: .zero, size: NSSize(width: 1, height: 1)), styleMask: [.borderless], backing: .buffered, defer: false) // on the top DefinitionWindow.level = .floating let pointInWindow = NSPoint(x:0,y:0); //default value DefinitionWindow.contentView?.showDefinition(for: attributedString, at: pointInWindow) DefinitionWindow.orderFront(nil) } } } let delegate = AppDelegate() let app = NSApplication.shared app.delegate = delegate app.run() full crash log reveals the following error message: FAULT: deferNSXPCInvocationOntoMainThread_block_invoke caught NSInternalInconsistencyException '_CPSSetFrontProcessWithOptions failed due to CGError -606 4294966690 fffffda2 (appIsDaemon)' with backtrace ( "0 CoreFoundation __exceptionPreprocess + 176", "1 libobjc.A.dylib objc_exception_throw + 60", "2 CoreFoundation +[NSException exceptionWithName:reason:userInfo:] + 0", "3 ViewBridge assertCGError + 80", "4 ViewBridge -[NSRemoteView _serviceWindowWouldActivate] + 724", "5 CoreFoundation __invoking___ + 148", "6 CoreFoundation -[NSInvocation invoke] + 428", "7 ViewBridge __deferNSXPCInvocationOntoMainThread_block_invoke + 120", "8 ViewBridge __wrapBlockWithVoucher_block_invoke + 56", "9 ViewBridge deferredBlockOpportunity_block_invoke_2 + 360", "10 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28", "11 CoreFoundation __CFRunLoopDoBlocks + 356", "12 CoreFoundation __CFRunLoopRun + 2440", "13 CoreFoundation CFRunLoopRunSpecific + 608", "14 HIToolbox RunCurrentEventLoopInMode + 292", "15 HIToolbox ReceiveNextEventCommon + 648", "16 HIToolbox _BlockUntilNextEventMatchingListInModeWithFilter + 76", "17 AppKit _DPSNextEvent + 660", "18 AppKit -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 716", "19 AppKit -[NSApplication run] + 476", "20 try main + 160", "21 dyld start + 2360" ) Just a reminder, the application will crash when you click on the displayed definition window. Potential Questions and Concerns: Could there be an issue related to UI transitions or the main thread? How exactly does the showDefinition(for:at) process work internally? Maybe , the view's display level being raised when clicked caused conflict? If anyone could provide any insights or guidance on resolving this issue, it would be greatly appreciated. Thank you!
0
0
405
Mar ’24
How change NSTableView's width using code?
I calculate cell view's width in func tableView(_ tableView: NSTableView, sizeToFitWidthOfColumn column: Int). I have a need to resize the tableview's width to just match total width of all cell views' (without scrollbars). But it seems changing tableview's width does not work: tableView.bounds.size = CGSize(width: w, height: tableView.bounds.height) I suspect that I should change its clipping view or enclosing scrollview, but don't have any idea on this. Any help?
0
0
551
Mar ’24
updating CommandLine.arguments on repeated 'open -a' commands
Wanted to add some basic scripting capabilities for an AppKit Swift application on macOS. I looked at adding AppleScript support (i.e. Cocoa Scripting) and it, frankly, hurts my head. I then discovered that Swift provides for CommandLine.argc and Commandline.arguments. So, from Terminal, I can do open -a myApp --args arg1 arg2 arg3 and sure enough, MyApp starts and CommandLine.arguments contain arg1, arg2, arg3 along w/ the first entry which is the fully resolved path of the executable. Great! However, if myApp is already running when I execute open -a myApp --args arg4 CommandLine.arguments are not updated and I get the same values as when I originally started the program (i.e. arg1, arg2, arg3 and not arg4). So I added func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { parseCommandLine(); return true} to AppDelegate and while parseCommandLine is called for my second open -a command, it still points to the old CommandLine.arguments. Even tried returning false, but no difference. Is there a way for CommandLine to be refreshed if myApp is already running? Or a different way to get the same effect?
0
0
406
Mar ’24
Any way to keep app running while keep main window hidden?
I tried many ways but it seems I just cannot get it working. // AppDelegate func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { true // false does not work either } // MainWC func windowShouldClose(_ sender: NSWindow) -> Bool { print(#function) if sender === NSApp.mainWindow { print("is main window") sender.setIsVisible(false) return false } return true } Once I hide the main window (using setIsVisible or orderOut) the app quits; even if I return false from applicationShouldTerminateAfterLastWindowClosed, NSApp.mainWindow will become nil.
1
0
631
Mar ’24
How let scroll event 'sink' to parent view?
I have an uncommon scenario here. outer tableview +--------------------------+ | column 1| inner tableview| +--------------------------+ Now most often the out tableview has many rows and vertical scrollbar visible. When user try to scroll vertically in the inner tableview but it has no vertical scrollbar (because it has only a few items), I want the scroll event sink into its parent view or better outer tableview, so that user does not have to move cursor to first column in outer tableview and scrolls. Is this possible?
1
0
658
Mar ’24
When to call noteHeightOfRows when cell view changes size?
I have a tableview with a column which has an inner tableview. I want to change height of the outer tableview to match the height of the inner tableview. outerTableView.reloadData() let range = outerTableView.rows(in: summaryTableView.superview!.visibleRect) outerTableView.noteHeightOfRows(withIndexesChanged: IndexSet(integersIn: range.lowerBound..<range.upperBound)) The above code will cause an exception: WARNING: NSTableView detected a rowView was requested from inside of the -heightOfRow delegate method. That is not supported! ( 0 CoreFoundation 0x000000019093eccc __exceptionPreprocess + 176 1 libobjc.A.dylib 0x0000000190426788 objc_exception_throw + 60 2 AppKit 0x000000019420be98 -[NSTableRowData _availableRowViewWhileUpdatingAtRow:] + 0 3 AppKit 0x000000019425a470 -[NSTableView viewAtColumn:row:makeIfNecessary:] + 32
1
1
517
Mar ’24
How to override Document's shouldCloseWindowController method in Swift
To me, the documentation for this method is not at all clear and needs to provide sample code. I tried searching the dev site for sample projects, but they're no longer where they lived for decades before. And where's the TextEdit sample project?! I need to override shouldCloseWindowController so I can make sure some sub-windows can be closed before closing the document's one and only window. I've done that, but then have no idea what I'm supposed to do to all the document to close. I tried this, which is what I think the NSDocument version header says to do: if ((self.windowControllers.first?.shouldCloseDocument) != nil){ self.canClose(withDelegate:delegate as Any, shouldClose:shouldCloseSelector, contextInfo:contextInfo); } But the document never gets the close() method called - only the window goes away.
0
0
467
Mar ’24
A Swift input method switcher works only after changing focus to another window
-1 I am trying to write a MacOS app which switch input methods by previously assigned shortcut(command+space in here). Switching input methods preoperly works so that the language icon at the status bar(top right) immediately changes as I put the shortcut. The problem I got in here is that the actual input method does not change. For example, if I run my app when the selected input method is Korean, then although the status bar is showing the selected input method is Japanese after command+space, what I can only type is Korean characters. However, after I change focus to another text app(e.g. from sublime text to xcode), only then the selected input method is reflected well. I am using MacOS Monterey 12.6 and Xcode 13.1. My project contains two source files. The code in the file AppDelegate.swift is as follows: import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { var switcher = Switcher() } And the code in the file Switcher.swift is as follows: import Cocoa import MASShortcut class Switcher{ var lang: Int = 0 var kr: TISInputSource? var jp: TISInputSource? var en: TISInputSource? init(){ let inputSourceNSArray = TISCreateInputSourceList(nil, false).takeRetainedValue() as NSArray let inputSourceList = inputSourceNSArray as! [TISInputSource] for inputSource in inputSourceList { if inputSource.id == "com.apple.inputmethod.Korean.2SetKorean" { self.kr = inputSource } if inputSource.id == "com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese" { self.jp = inputSource } if inputSource.id == "com.apple.keylayout.ABC" { self.en = inputSource } } self.register() } func switchLang(){ self.lang = (self.lang + 1) % 3 switch lang { case 0: TISSelectInputSource(self.kr) case 1: TISSelectInputSource(self.jp) case 2: TISSelectInputSource(self.en) default: print("error") } } func register() { let langShortcut = MASShortcut(keyCode: kVK_Space, modifierFlags: [.command]) MASShortcutMonitor.shared()?.register(langShortcut, withAction: { self.switchLang() }) } } I wrote these codes by referring KAWA, but KAWA does not make this issue. I have analyzed all codes of KAWA several times, I couldn't find out why the same problem does not occur in KAWA. I am quite new to Swift, and I have no idea to approach. Could you help me....? Thank you.
0
0
649
Mar ’24