当我按下ESC键时,我试图获得一个自定义NSTextFieldCell(在a内NSOutlineView)结束编辑,但找不到任何方法来完成此操作.我试图为NSControlTextDidChangeNotification-notification 添加一个观察者,但它没有被激活,因为ESC-key也没有被keyDown触发NSOutlineView.
我使用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]将最初正确格式化数字,但如果我输入它,我再次无法输入小数点.
我在这里错过了什么?你会认为这很简单
在NSTableView更改表视图大小时,基于视图的具有动态高度的行不会调整其行的大小.当行高从表视图的宽度派生时,这是一个问题(想想填充列并包装因此扩展行大小的文本块).
NSTableView每当它改变大小但我没有成功时,我一直试图调整行的大小:
enumerateAvailableRowViewsUsingBlock:,则一些不可见的行不会调整大小,因此当用户滚动并显示这些行时,会显示旧的高度.有人可以帮忙吗?
这是我检测表视图大小更改的位置 - 在表视图的委托中:
- (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) 我想从一个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文件构建一个,我不知道该怎么办?
本WKWebView类不支持scrollView在MacOS财产.此外,它的视图层次结构不包含NSScrollView实例(我已使用10.12上的视图调试进行了检查)
现在是否有另一种方法来设置WKWebViewon macOS 的滚动插入和内容插入?我想把一个半透明的视图叠加在它的边缘上.
我正在为macOS构建一个小型实用程序应用程序,它将SpriteKit与AppKit结合在一起.具体来说,我使用SKView作为应用程序窗口的"背景"(主要用于SpriteKit中更容易的特定类型的动画).我也在改变Window的background属性的颜色来调整标题栏颜色.在绿色和红色之间切换.
我遇到的问题是AppKit和SpriteKit之间的颜色匹配.简而言之,它们并不匹配.正如您在图像中看到的那样,标题栏与SKView略有不同.
经过一段时间的游戏后,我发现SKView中的背景颜色位于"设备RGB颜色空间"中,窗口颜色位于"sRGB IEC61966-2.1颜色空间"中.我将AppKit颜色更改为设备RGB,颜色仍然不匹配.
我正在使用常规的旧NSColor初始化程序创建颜色.
我不确定你是否可以改变颜色的颜色空间.Window和SKView上的backgroundColor属性是只读的.
有任何想法吗?
截至2018年,使用AppKit / Cocoa创建自定义控件的正确方法是什么?
传统技术是继承NSControl和/或NSCell实现您要实现的自定义控件的类型。(例如进行NSButton自定义绘图的。)
但是,在WWDC 2014-204中,Apple表示将NSCell要进行“正式弃用”。在WWDC 2012-217中,Apple建议子类化NSView并利用图层支持和图层属性来绘制简单按钮。
如果您子类化NSView以创建自定义控件(例如“更好的按钮”),那么您将失去很多NSControl提供的功能,例如预接线action和target属性,鼠标跟踪,键盘激活以及可能还有很多其他功能。我什至不知道
如果您继承NSControl,甚至继承NSButton,那么接管所有图形的正确方法是什么?Apple的《编程指南》尚未对此进行更新。尤其是,NSButton子类可以仅覆盖draw...自身的所有方法NSCell,然后执行其想要做的事情updateLayer吗?是否可以保证现有的NSButton/NSButtonCell绘图代码仍不会进行任何绘图?
如果要构建具有自定义背景的按钮但仍使用基于字符串的title或,该attributedTitle怎么办?NSButton提供此功能,但title图形如何与之交互updateLayer?
我的用例是创建一个自定义按钮,该按钮提供比传统按钮更多的视觉状态和更多的视觉设计NSButton。使用层支持NSView并updateLayer轻松实现所有不同的状态,但是我更喜欢继承子类,NSControl或者甚至NSButton还保留那些类已经提供的所有功能。
编辑1:基于以下注释更改了措词,以更准确地反映NSCell的当前弃用状态。
我正在使用 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这是我第一次使用 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) 我有一个从状态栏运行的 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 ×10
cocoa ×6
macos ×6
swift ×4
objective-c ×2
colors ×1
combine ×1
java ×1
macos-sonoma ×1
nsstatusitem ×1
nstableview ×1
nstextfield ×1
sikuli-x ×1
sprite-kit ×1
webkit ×1
wkwebview ×1