标签: appkit

如何在按下ESC键后在NSOutlineView内的NSTextFieldCell中结束编辑

当我按下ESC键时,我试图获得一个自定义NSTextFieldCell(在a内NSOutlineView)结束编辑,但找不到任何方法来完成此操作.我试图为NSControlTextDidChangeNotification-notification 添加一个观察者,但它没有被激活,因为ESC-key也没有被keyDown触发NSOutlineView.

cocoa objective-c appkit nstextfieldcell

9
推荐指数
1
解决办法
2153
查看次数

NSNumberFormatter不允许输入十进制数字

我使用NSNumberFormatter完全不知所措.这应该是完全简单但我不能让它工作.

我想设置一个NSTextField以允许输入十进制数字,或者带小数点或不带小数点.以下是我认为可行的方法:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:4];
[formatter setAllowsFloats:YES];
[[timeFlowMultiplierTF cell] setFormatter:formatter];
Run Code Online (Sandbox Code Playgroud)

但是,在文本字段中键入时,按小数点的"句点"键不会产生一个.键入"3.14"给我"314".抛出[formatter setAlwaysShowsDecimalSeparator:YES]将最初正确格式化数字,但如果我输入它,我再次无法输入小数点.

我在这里错过了什么?你会认为这很简单

macos cocoa nstextfield appkit nsnumberformatter

9
推荐指数
1
解决办法
1617
查看次数

正确调整基于视图的NSTableView上的行的大小

NSTableView更改表视图大小时,基于视图的具有动态高度的行不会调整其行的大小.当行高从表视图的宽度派生时,这是一个问题(想想填充列并包装因此扩展行大小的文本块).

NSTableView每当它改变大小但我没有成功时,我一直试图调整行的大小:

  • 如果我通过查询仅调整可见行的大小enumerateAvailableRowViewsUsingBlock:,则一些不可见的行不会调整大小,因此当用户滚动并显示这些行时,会显示旧的高度.
  • 如果我调整所有行的大小,当有很多行时会变得非常慢(在我的1.8Ghz i7 MacBook Air中每个窗口调整1000行后大约1秒延迟).

有人可以帮忙吗?

这是我检测表视图大小更改的位置 - 在表视图的委托中:

- (void)tableViewColumnDidResize:(NSNotification *)aNotification
{
    NSTableView* aTableView = aNotification.object;
    if (aTableView == self.messagesView) {
        // coalesce all column resize notifications into one -- calls messagesViewDidResize: below

        NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self];
        [[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle];
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是上面发布的通知的处理程序,其中可见行的大小调整:

-(void)messagesViewDidResize:(NSNotification *)notification
{
    NSTableView* messagesView = self.messagesView;

    NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new];
    [messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) {
        if (row >= 0) {
            [visibleIndexes addIndex:row];
        } …
Run Code Online (Sandbox Code Playgroud)

macos cocoa objective-c nstableview appkit

9
推荐指数
1
解决办法
4964
查看次数

如何在Swift中初始化NSWindowController?

我想从一个nib文件初始化一个窗口控制器对象,这很简单吗?但我根本无法让它发挥作用.

根据我之前在ObjC的经验,我写下了以下代码:

init()  {
    super.init(windowNibName: "SplitWindowController")
}
Run Code Online (Sandbox Code Playgroud)

在app委托文件中,我只需初始化并显示窗口:

var myWindowController: MyWindowController = MyWindowController()
myWindowController.showWindow(self)
myWindowController.window.makeKeyAndOrderFront(nil)
Run Code Online (Sandbox Code Playgroud)

但是编译器给了我这个错误:Must call a designated initializer of the superclass 'NSWindowController'.并根据雨燕版本NSWindowController定义,只有3个指定的初始值,即init(),init(window),init(coder).我不知道接下来该做什么.我应该NSCoder从一个nib文件构建一个,我不知道该怎么办?

cocoa appkit swift

9
推荐指数
2
解决办法
5949
查看次数

如何在WKWebView上设置内容和滚动插图?

WKWebView类不支持scrollView在MacOS财产.此外,它的视图层次结构不包含NSScrollView实例(我已使用10.12上的视图调试进行了检查)

现在是否有另一种方法来设置WKWebViewon macOS 的滚动插入和内容插入?我想把一个半透明的视图叠加在它的边缘上.

macos cocoa webkit appkit wkwebview

9
推荐指数
1
解决办法
440
查看次数

匹配AppKit和SpriteKit颜色

我正在为macOS构建一个小型实用程序应用程序,它将SpriteKit与AppKit结合在一起.具体来说,我使用SKView作为应用程序窗口的"背景"(主要用于SpriteKit中更容易的特定类型的动画).我也在改变Window的background属性的颜色来调整标题栏颜色.在绿色和红色之间切换.

我遇到的问题是AppKit和SpriteKit之间的颜色匹配.简而言之,它们并不匹配.正如您在图像中看到的那样,标题栏与SKView略有不同.

在此输入图像描述

经过一段时间的游戏后,我发现SKView中的背景颜色位于"设备RGB颜色空间"中,窗口颜色位于"sRGB IEC61966-2.1颜色空间"中.我将AppKit颜色更改为设备RGB,颜色仍然不匹配.

我正在使用常规的旧NSColor初始化程序创建颜色.

我不确定你是否可以改变颜色的颜色空间.Window和SKView上的backgroundColor属性是只读的.

有任何想法吗?

macos colors appkit sprite-kit swift

9
推荐指数
1
解决办法
123
查看次数

您是否仍应在2018年继承NSControl

截至2018年,使用AppKit / Cocoa创建自定义控件的正确方法是什么?

传统技术是继承NSControl和/或NSCell实现您要实现的自定义控件的类型。(例如进行NSButton自定义绘图的。)

但是,在WWDC 2014-204中,Apple表示将NSCell要进行“正式弃用”。在WWDC 2012-217中,Apple建议子类化NSView并利用图层支持和图层属性来绘制简单按钮。

如果您子类化NSView以创建自定义控件(例如“更好的按钮”),那么您将失去很多NSControl提供的功能,例如预接线actiontarget属性,鼠标跟踪,键盘激活以及可能还有很多其他功能。我什至不知道

如果您继承NSControl,甚至继承NSButton,那么接管所有图形的正确方法是什么?Apple的《编程指南》尚未对此进行更新。尤其是,NSButton子类可以仅覆盖draw...自身的所有方法NSCell,然后执行其想要做的事情updateLayer吗?是否可以保证现有的NSButton/NSButtonCell绘图代码仍不会进行任何绘图?

如果要构建具有自定义背景的按钮但仍使用基于字符串的title或,该attributedTitle怎么办?NSButton提供此功能,但title图形如何与之交互updateLayer

我的用例是创建一个自定义按钮,该按钮提供比传统按钮更多的视觉状态和更多的视觉设计NSButton。使用层支持NSViewupdateLayer轻松实现所有不同的状态,但是我更喜欢继承子类,NSControl或者甚至NSButton还保留那些类已经提供的所有功能。

编辑1:基于以下注释更改了措词,以更准确地反映NSCell的当前弃用状态。

macos cocoa appkit

8
推荐指数
0
解决办法
427
查看次数

java.lang.NoSuchMethodError?accessibilityHitTest

我正在使用 Sikulix 2.0.6。\n消息字段中有错误:\njava.lang.NoSuchMethodError\xef\xbc\x9aaccessibilityHitTest

\n

我看了\n https://github.com/openjdk/jdk/pull/5702

\n

但仍然不知道如何解决它。

\n

和我的终端日志:\n线程“AppKit Thread”2021-11-25 23:12:27.606 java[4714:116836] 错误 JNI 查找可访问性HitTest 中出现异常

\n

我用的是m1 mac。\n有人有类似情况吗?

\n

- - 更新 - - -

\n

每次我单击 IDE 时,错误行都会增加。\n当我更改 ide 的窗口大小时,错误会奇怪地消失,但是当我重新启动时,我会再次收到错误。

\n

在此输入图像描述

\n

java appkit sikuli-x

8
推荐指数
1
解决办法
6303
查看次数

致命错误:UnsafeRawBufferPointer 从 Core Data/NSFetchedResultsController 删除对象时计数为负

这是我第一次使用 AppKit 和NSTableView. 它由NSFetchedResultsController核心数据支持。当数据集发生更改时,Notification将发送:

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
    guard let links = self.fetchedResultsController.fetchedObjects else {
        return
    }

    if self.viewContext.hasChanges {
        try? self.viewContext.save()
    }
        
    self._links = links
    NotificationCenter.default.post(name: .reloadLinkList, object: nil)
}
Run Code Online (Sandbox Code Playgroud)
NotificationCenter.default.publisher(for: .reloadLinkList).receive(on: RunLoop.main).sink { notification in
    self.list.tableView.reloadData()
    self.list.linksModel.selectedRows = IndexSet([])
}
.store(in: &cancellables)
Run Code Online (Sandbox Code Playgroud)

这对于插入和更新数据非常有用。当我尝试删除某些内容时,我得到:

Thread 1: Fatal error: UnsafeRawBufferPointer with negative count
Run Code Online (Sandbox Code Playgroud)

删除选定对象的代码如下:

Thread 1: Fatal error: UnsafeRawBufferPointer with negative count …
Run Code Online (Sandbox Code Playgroud)

macos appkit nsfetchedresultscontroller swift combine

8
推荐指数
1
解决办法
2167
查看次数

macOS Sonoma:出现 UI 时激活仅菜单栏的应用程序

语境

我有一个从状态栏运行的 Mac 应用程序。NSStatusItem单击an 时,我显示 anNSWindow而不是标准的NSMenu

问题

在 Sonoma 之前,当NSStatusItem单击 时,我使用了activate(ignoringOtherApps: true)现已弃用的 API,以确保我的应用程序成为活动应用程序。这非常有效,所以苹果决定用核武器攻击它。

在 Sonoma 上,macOS 现在显示我的窗口,但不激活应用程序,这意味着用户必须单击 ,NSStatusItem然后再次单击窗口,然后才能与我的 UI 交互。当用户单击窗口时,它还会产生非常不和谐的体验因为活动应用程序最终会切换,但不是在用户期望的时候切换。我的窗口和之前活动的应用程序突然以不同的状态重绘。它很丑。

最糟糕的是,该问题仅在大约 85% 的时间内发生。15% 的情况下,系统会在显示 UI 时激活我的应用程序。我还无法确定它的模式,但这与 AppKit 发行说明相吻合,表明系统“可能”激活我的应用程序。(毫无疑问,如果一些愚蠢的、过度设计的、机器学习的官样文章认为这是值得做的。)

问题

我如何告诉系统,当我的 NSStatusItem 被单击时,我的应用程序需要变为活动状态,因为 (A) 这是用户所期望的,(B) 替代方案看起来 macOS 已损坏?

尝试

我尝试过NSApplication.shared.setActivationPolicy()使用两者.accessory和甚至进行设置.regular(即使添加了 Dock 图标和菜单栏),但问题仍然存在。

appkit nsstatusitem nsapplication swift macos-sonoma

8
推荐指数
1
解决办法
512
查看次数