我有一个应用程序,打开popover NSTextField
.文本字段不可编辑.文本字段的行为设置为Editable
.我仍然可以粘贴和复制文本到这个字段,但我无法编辑它.
谁知道,哪有什么不对?
嗨我在我的一个应用程序中实现了NSPopover,但popover不会关闭.我猜它应该在我点击其他东西时关闭,但事实并非如此.我知道有一个关闭的弹出操作,但只适用于不同的按钮.当我按下相同的按钮时,如何让它看到弹出窗口打开以及何时打开以关闭弹出窗口?
我正在使用doubleClickAction
a NSTableView
来显示一个NSPopover
.像这样的东西:
NSInteger selectedRow = [dataTableView clickedRow];
NSInteger selectedColumn = [dataTableView clickedColumn];
// If something was not selected, then we cannot display anything.
if(selectedRow < 0 || selectedColumn < 0)
{
NSLog(@"Invalid selected (%ld,%ld)", selectedRow, selectedColumn);
return;
} // End of something was not selected
// Setup our view controller, make sure if there was already a popover displayed, that we kill that one off first. Finally create and display our new popover.
DataInspectorViewController * …
Run Code Online (Sandbox Code Playgroud) 有没有办法让NSNumberFormatter(或者可能是任何其他NSFormatter)在NSPopover中工作?
弹出窗口中的NSTextField值绑定到NSViewController的representObject.当在字段中输入无效数字(例如,"asdf")时,在NSWindow中会显示一个表示该值无效的表格,其中包含呈现弹出窗口的NSView.
单击"确定"后,您将获得以下回溯:
* thread #1: tid = 0x4e666a, 0x00007fff931f9097 libobjc.A.dylib`objc_msgSend + 23, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
frame #0: 0x00007fff931f9097 libobjc.A.dylib`objc_msgSend + 23
frame #1: 0x00007fff8a1fa6c8 AppKit`-[NSTextView(NSSharing) becomeKeyWindow] + 106
frame #2: 0x00007fff8a080941 AppKit`-[NSWindow(NSWindow_Theme) acquireKeyAppearance] + 207
frame #3: 0x00007fff8a0800df AppKit`-[NSWindow becomeKeyWindow] + 1420
frame #4: 0x00007fff8a07f5c6 AppKit`-[NSWindow _changeKeyAndMainLimitedOK:] + 803
frame #5: 0x00007fff8a1a205d AppKit`-[NSWindow _orderOutAndCalcKeyWithCounter:stillVisible:docWindow:] + 1156
frame #6: 0x00007fff8a0876c5 AppKit`-[NSWindow _reallyDoOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 3123
frame #7: 0x00007fff8a0867f0 AppKit`-[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] + 786
frame #8: 0x00007fff8a086470 AppKit`-[NSWindow …
Run Code Online (Sandbox Code Playgroud) 我没有找到一些使用Interface Builder动态创建NSPopover的示例.
下面的代码给出了一个异常,加载了nib,但没有设置视图:
NSViewController *controller = [[NSViewController alloc] initWithNibName:@"View" bundle:nil];
NSPopover *popover = [[NSPopover alloc] init];
[popover setContentSize:NSMakeSize(100.0f, 100.0f)];
[popover setContentViewController:controller];
[popover setAnimates:YES];
[popover showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
[popover release];
[controller release];
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
2011-10-22 12:00:16.804 Test[2020:707] -[NSViewController loadView] loaded the "View" nib but no view was set.
2011-10-22 12:00:16.807 Test[2020:707] (
0 CoreFoundation 0x00007fff87e10286 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff92f2cd5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff87e100ba +[NSException raise:format:arguments:] + 106
3 CoreFoundation 0x00007fff87e10044 +[NSException raise:format:] + 116
4 AppKit 0x00007fff90951e21 …
Run Code Online (Sandbox Code Playgroud) 免责声明:这个问题是一个扩展到这个问题
我正在尝试在NSPopover中填充表格.(如图所示)
问题:
我无法为NSTextField创建透明背景.
奇怪的是,如果将视图附加到NSWindow,它的工作正常
(左侧窗口中的名称具有透明背景,但在NSPopover中看到的相同视图无法向NSTextfield显示透明背景.)
这是NSPopover中的错误还是我做错了什么?
这是我创建表格单元格的代码
func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
var cell = NSTableCellView(frame: NSMakeRect(0, 0, 100, 40))
var textField = NSTextField(frame: NSMakeRect(0, 0, 50, 20))
// **For transparency**
textField.stringValue = nameList[row]
textField.bezeled = false
textField.editable = false
textField.drawsBackground = false
cell.addSubview(textField)
return cell
}
Run Code Online (Sandbox Code Playgroud) 我目前有一个NSPopover子类,它将内容视图控制器设置为一个自定义NSViewController,用于表示选项卡视图:
self.popover.contentViewController = tabViewController;
self.popover.animates = YES;
Run Code Online (Sandbox Code Playgroud)
我正在推出自己的"标签视图控制器",因为我听说NSTabViewController与动画效果不佳.我想使用自动布局,所以我不认为我想要使用popover的contentSize属性.当我更改标签时,弹出窗口会正确地更改其大小,但是,它不会为更改设置动画.此外,我有一个交叉淡入淡出动画,当选项卡视图切换并且弹出窗口没有调整大小直到动画结束后发生.
首先,我想弄清楚如何让popover调整为动画,然后我会担心让动画同步.
谢谢
当我打开NSPopover时,我收到以下错误:
WARNING: <NSPopover: 0x618000120780> needed 3 or more *consecutive* layout
passes to prepare to be shown. Verify that nothing in your view hierarchy
is aggressively dirtying layout during layout, as this will likely
cause problems elsewhere.
Run Code Online (Sandbox Code Playgroud)
这刚刚开始出现在最近的版本中,我无法找到导致它的原因.我在弹出窗口显示之前删除了所有准备代码,因此它基本上调用:
- (IBAction)addClicked:(id)sender {
[[self addPopover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxYEdge];
}
Run Code Online (Sandbox Code Playgroud)
我也删除了IB窗口中的所有约束.所以我不应该在需要重画的布局中做任何事情.
搜索网络的信息非常少,无论如何我都能找到.我的popover用于表单输入,因此有4个NSTextFields,一个NSOutlineView和一个NSImage.它还会创建一个隐藏的WebView,用户无法看到它并用于服务器处理.
OSX 10.7+
有任何想法吗?谢谢杰夫
此应用程序的目的是确保用户在NSTextField中输入了某个文本.如果该文本不在该字段中,则不应允许它们离开该字段.
给定一个带有子类文本字段的macOS应用程序,一个按钮和另一个通用的NSTextField.单击该按钮时,将显示一个"附加"到字段的NSPopover,该字段由名为myPopoverVC的NSViewController控制.
例如,用户在顶部字段中输入3,然后单击显示弹出窗口的"显示弹出窗口"按钮并提供提示:"1 + 1等于什么".
请注意,此popover有一个标记为1st resp的字段,因此当弹出窗口显示时,该字段将成为第一个响应者.此时不会输入任何内容 - 这只是针对这个问题.
用户可以单击"关闭"按钮,关闭弹出窗口.此时,如果用户点击或标记离开字段中的"3",应该会发生什么,应用程序不应允许该移动 - 可能会发出蜂鸣声或其他消息.但是当弹出窗口关闭并且用户按Tab键时会发生什么
即使其中带有"3"的字段有一个焦点环,它应该在该窗口中再次指示第一个响应者,但是由于未调用textShouldEndEditing函数,用户可以单击或标记它.在这种情况下,我点击了弹出窗口中的关闭按钮,'3'字段有一个聚焦环,我点击了tab,然后进入下一个字段.
这是子文本字段中的函数,在文本输入字段后可以正常工作.在这种情况下,如果用户键入3然后点击Tab,则光标停留在该字段中.
override func textShouldEndEditing(_ textObject: NSText) -> Bool {
if self.aboutToShowPopover == true {
return true
}
if let editor = self.currentEditor() { //or use the textObject
let s = editor.string
if s == "2" {
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)
showPopover按钮代码将aboutToShowPopover标志设置为true,这将允许子类显示弹出窗口.(当弹出窗口关闭时设置为false)
所以问题是当popover关闭如何将firstResponder状态返回到原始文本字段时?它似乎具有第一响应者状态,并且它认为它具有该状态,尽管未调用textShouldEndEditing.如果你在字段中键入另一个字符,那么一切都按预期工作.就好像窗口的字段编辑器和其中包含"3"的字段一样,因此字段编辑器不会将调用传递给该字段.
该按钮调用一个包含以下内容的函数:
let contentSize = myPopoverVC.view.frame
theTextField.aboutToShowPopover = true
parentVC.present(myPopoverVC, asPopoverRelativeTo: contentSize, of: theTextField, preferredEdge: NSRectEdge.maxY, behavior: NSPopover.Behavior.applicationDefined)
NSApplication.shared.activate(ignoringOtherApps: true) …
Run Code Online (Sandbox Code Playgroud) 我正在NSPopover
通过将其设置为自定义视图来实现并将其显示在状态栏中.我已将其行为设置为Transient,并且还添加了一个全局事件监视器,以便当任何其他应用程序获得焦点时,它NSPopover
就会消失.
这工作得相当好,但我遇到的唯一问题是点击弹出窗口会聚焦应用程序的主窗口.如果我把窗口放在一个空间上并在另一个空间上查看popover并与popover交互,我会被主窗口抛回到空间并且它会被聚焦.有办法防止这种情况吗?也许允许与popover交互而不激活应用程序?
cocoa ×10
nspopover ×10
macos ×4
objective-c ×4
appkit ×2
nstextfield ×2
autolayout ×1
nsformatter ×1
nsstatusitem ×1
nstableview ×1
paintcode ×1
popover ×1
swift ×1
uibuilder ×1
warnings ×1