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

AppKit Documentation

Posts under AppKit tag

234 Posts
Sort by:
Post not yet marked as solved
3 Replies
876 Views
Sonoma beta release notes mention that NSMenu was rewritten from scratch using AppKit, however, it seems like a lot of behavior was removed along the way which breaks applications. I've filed several requests using Feedback Assistant, but none of them were fixed in the 3 following betas. FB12867496: NSMenu no longer receives keyboard events from GetEventDispatcherTarget (there is a workaround) FB12867573: NSMenuItem custom view window is nil FB12887219 : NSMenu performSelector highlightItem doesn't highlight menu item FB12938907: NSMenu not properly updated when adding/removing NSMenuItem I wonder if anyone else has experienced similar problems and can share workarounds for them:
Posted
by p0deje.
Last updated
.
Post not yet marked as solved
4 Replies
1.1k Views
Filed as rdar://FB11975037 When macOS Ventura is run as a guest OS within the virtualization framework, the main menu bar items will not be displayed correctly if VZMacGraphicsDisplayConfiguration defines a large resolution. The menu bar titles appear to be using the same color as the menu bar itself. When the Appearance is set to Light, the menu bar items are effectively invisible. When the Appearance is set to Dark, the menu bar items are drawn in what looks like a disabled state. This only affects the menu bar item titles on the left-hand side. The date-time and menu bar icons on the right side are always displayed in the correct color. This appears to be a regression in macOS Ventura as this issue is not present in macOS 12 running as a guest. This bug can be easily reproduced using Apple's own Virtualization sample code titled: "Running macOS in a Virtual Machine on Apple Silicon Macs" Steps to reproduce: Follow the sample code instructions for building and installing a VM.bundle. Before running 'macOSVirtualMachineSampleApp', change the VZMacGraphicsDisplayConfiguration to use: width = 5120, height = 2880, ppi = 144. Run 'macOSVirtualMachineSampleApp' and notice that the menu bar titles on the left side of the screen are not correctly drawn in the guest instance. This has been tested on: Host: macOS 13.1 Guest: macOS 13.x (All versions) Hardware: MBP 14" M1 Pro 32GB/2TB Is there anything that can be done to resolve this issue?
Posted
by kennyc.
Last updated
.
Post not yet marked as solved
1 Replies
343 Views
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.
Posted
by imneo.
Last updated
.
Post not yet marked as solved
0 Replies
200 Views
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?
Posted
by parker9.
Last updated
.
Post not yet marked as solved
0 Replies
319 Views
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?
Posted
by imneo.
Last updated
.
Post not yet marked as solved
0 Replies
194 Views
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!
Posted
by WOTMCCR.
Last updated
.
Post not yet marked as solved
3 Replies
282 Views
I have some old code that a user has prodded me into trying to resolve. The issue is that the window does not size correctly on its first appearance. Stepping through my code, on initial entry to the windowDidLoad method, the size is (800, 472), which seems to correspond with the size in Interface Builder. I go and calculate the size that I want, and in one case it turns out to be (1235, 435), and I use setContentSize to get the window to the correct size. However, it is not that size when it appears, and when I get a chance to look at it, the size is (816, 435). When it runs through the same code in response to the user setting the scale, the size is correctly (1235, 435). Just to be non-deterministic, sometimes the height is 411. The numbers may change, but the difference in height is always either 0 or 24. Is there something that runs after windowDidLoad that changes the window size? Or any other clues to track down why the size changes?
Posted
by Mussau.
Last updated
.
Post not yet marked as solved
0 Replies
257 Views
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.
Posted
by _Filip_.
Last updated
.
Post not yet marked as solved
0 Replies
145 Views
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!
Posted
by WOTMCCR.
Last updated
.
Post not yet marked as solved
0 Replies
138 Views
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!
Posted
by WOTMCCR.
Last updated
.
Post marked as solved
4 Replies
378 Views
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?
Posted
by JohnLove.
Last updated
.
Post not yet marked as solved
0 Replies
275 Views
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?
Posted Last updated
.
Post not yet marked as solved
2 Replies
297 Views
While debugging my app in Xcode, my app calls SetFrontProcess which is returning an OSErr of -13066. What does -13066 mean? Possibly means "SetFrontProcess was deprecated in 10.9, why are you still using it?" But I thought I'd check.
Posted Last updated
.
Post not yet marked as solved
0 Replies
195 Views
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?
Posted
by barryli.
Last updated
.
Post not yet marked as solved
0 Replies
194 Views
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!
Posted
by __Pavel__.
Last updated
.
Post not yet marked as solved
0 Replies
276 Views
Hello, I need to monitor input events and convert keycode to symbol. E.g. convert kHIDUsage_KeyboardQ to symbol according to used keyboard layout. Are there any API to get current keyboard layout (language) in C++? If I understand correctly, the API TISGetInputSourceProperty() is deprecated. Are there any way to monitor keyboard layout changed? (some system notification in case of keyboard layout change) Are there any way to translate keycode to symbol except UCKeyTranslate() which is part of deprecated Unicode Utilities? Thank you in advance.
Posted Last updated
.
Post not yet marked as solved
2 Replies
304 Views
Configuration: I have a NSTextField (multiline) inside an NSWindow. I have another NSTextField (single line) inside an NSBox (which is in the same window). The multiline text field is first responder and is editing. I click on the single line text field inside the NSBox to edit that one. The NSWindow just closes. This is on Sonoma 14.2.1. I subclassed NSWindow and override the close method and put a breakpoint. Here's the call stack that leads to the window suddenly closing: #1 0x0000000189c73d90 in -[NSWindow __close] () #2 0x000000032343 in -[NSApplication(NSResponder) sendAction:to:from:] () #3 0x0000000189b543ac in -[NSControl sendAction:to:] () #4 0x0000000189b542f0 in __26-[NSCell _sendActionFrom:]_block_invoke () #5 0x0000000189b54218 in -[NSCell _sendActionFrom:] () #6 0x0000000189b5413c in -[NSButtonCell _sendActionFrom:] () #7 0x0000000189c4c508 in __29-[NSButtonCell performClick:]_block_invoke () #8 0x0000000189c4c264 in -[NSButtonCell performClick:] () #9 0x0000000189b545a8 in -[NSApplication(NSResponder) sendAction:to:from:] () #10 0x0000000189b543ac in -[NSControl sendAction:to:] () #11 0x0000000189befb48 in -[NSTextField textDidEndEditing:] () #12 0x0000000__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ () #13 0x000000018625c65c in ___CFXRegistrationPost_block_invoke () #14 0x000000018625c5a4 in _CFXRegistrationPost () #15 0x00000001861971dc in _CFXNotificationPost () #16 0x0000000187289ff0 in -[NSNotificationCenter postNotificationName:object:userInfo:] () #17 0x0000000189bef754 in -[NSTextView(NSSharing) resignFirstResponder] () #18 0x0000000189a9fab8 in -[NSWindow _realMakeFirstResponder:] () #19 0x0000000189b4f18c in -[NSWindow(NSEventRouting) _handleMouseDownEvent:isDelayedEvent:] () #20 0x0000000189ada79c in -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] () #21 0x0000000189ada45c in -[NSWindow(NSEventRouting) sendEvent:] () #22 0x000000018a1879f4 in -[NSApplication(NSEventRouting) sendEvent:] () #23 0x0000000189dd6908 in -[NSApplication _handleEvent:] () #24 0x00000001899a1d74 in -[NSApplication run] () The mouse click is no where near the close button in the title bar.
Posted Last updated
.
Post marked as solved
4 Replies
1.1k Views
I'm manually placing a subclass of NSView into the parent view using addSubview:positioned:relativeTo. The dirtyRect passed to drawRect: is wildly incorrect. Can folks attempt to reproduce and file bugs? This is awfully close to the release of Sonoma, and I feel like folks with bezier curves (or maybe other drawing code?) in their NSView subclasses are going to experience problems. To reproduce, place a view (I'm using an NSImageView) as a subview within a view. Then, create a subclass of NSView and draw a bezier curve in the drawRect method. Add an instance of this subclass as a subview of your original view. I'm offsetting the x value for clarity. When I build with Xcode 15 and run on Ventura or earlier, I get the correct result. Or, if I build with Xcode 14.3 and run on Sonoma I get the correct result. However, when I build in Xcode 15 and run on the RC build of Sonoma, I get a whacky result. I get something like (origin = (x = -264, y = -146), size = (width = 480, height = 388)) for the dirtyRect in the error case, while the rect is supposed to be (origin = (x = 0, y = 0), size = (width = 48, height = 48)) (I'm basing the frame of the new view on the original image.) Thanks!
Posted Last updated
.
Post not yet marked as solved
1 Replies
253 Views
Is there any way to get dock size? I got Dock Window using CGWindowListCopyWindowInfo. But I found its frame covers my entire screen. Same promble as Notification Center. Any way to get their size?
Posted
by Hylas.
Last updated
.