- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只有 OS X 10.9 的主从类型应用程序:
窗口左侧有一个 NSTableView,右侧有 NSTextFields 详细信息。
我没有专门设置选项卡顺序,开箱即用就可以了。
插入新对象后除外:
我想要什么:
更新:我发现奇怪的行为是通过在 Interface Builder 中启用 NSArrayController 的“自动重新排列内容”来触发的。如果我禁用它,我就不会再失去焦点。请参阅 CoreData-bound NSTableView loses input focus when items change, but only if sorted 。
但是,当然,我仍然希望我的内容能够自动排序 - 只是在操作期间不会失去焦点。这可以吗?
更新2:当我的文本字段失去键盘焦点时,我遵循了@KenThomases的建议并记录了此时的堆栈跟踪:
2014-08-17 16:30:26.003 ResponderExperiment[712:303] (
0 ResponderExperiment 0x00000001000014dd -[WMWindow makeFirstResponder:] + 61
1 AppKit 0x00007fff8d25c778 -[NSTextView(NSPrivate) _giveUpFirstResponder:] + 257
2 AppKit 0x00007fff8d25c56c -[NSTextView(NSKeyBindingCommands) insertTab:] + 270
3 AppKit 0x00007fff8d22dc2f -[NSResponder doCommandBySelector:] + 71
4 AppKit 0x00007fff8d25b10a -[NSTextView doCommandBySelector:] + 196
5 AppKit 0x00007fff8d22d151 -[NSKeyBindingManager(NSKeyBindingManager_MultiClients) interpretEventAsCommand:forClient:] + 1392
6 AppKit 0x00007fff8d24c1c2 -[NSTextInputContext handleEvent:] + 845
7 AppKit 0x00007fff8d22b9dd -[NSView interpretKeyEvents:] + 180
8 AppKit 0x00007fff8d24bd6d -[NSTextView keyDown:] + 658
9 AppKit 0x00007fff8d1f856b -[NSWindow sendEvent:] + 1843
10 AppKit 0x00007fff8d199b32 -[NSApplication sendEvent:] + 3395
11 AppKit 0x00007fff8cfe99f9 -[NSApplication run] + 646
12 AppKit 0x00007fff8cfd4783 NSApplicationMain + 940
13 ResponderExperiment 0x0000000100002de2 main + 34
14 libdyld.dylib 0x00007fff8c5bf5fd start + 1
15 ??? 0x0000000000000003 0x0 + 3
)
2014-08-17 16:30:26.014 ResponderExperiment[712:303] (
0 ResponderExperiment 0x00000001000014dd -[WMWindow makeFirstResponder:] + 61
1 AppKit 0x00007fff8d03c918 -[NSControl abortEditing] + 83
2 AppKit 0x00007fff8d2723e0 -[NSValueBinder discardEditing] + 162
3 AppKit 0x00007fff8d1aee30 -[NSController discardEditing] + 115
4 AppKit 0x00007fff8d1af971 -[NSArrayController rearrangeObjects] + 27
5 AppKit 0x00007fff8d3697a9 -[NSArrayController observeValueForKeyPath:ofObject:change:context:] + 294
6 AppKit 0x00007fff8d39ac08 -[NSArrayController _setMultipleValue:forKeyPath:atIndex:] + 323
7 AppKit 0x00007fff8d39ba12 -[NSArrayController _setSingleValue:forKeyPath:] + 137
8 Foundation 0x00007fff8bf9e19a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 285
9 AppKit 0x00007fff8d25444c -[NSBinder _setValue:forKeyPath:ofObject:mode:validateImmediately:raisesForNotApplicableKeys:error:] + 364
10 AppKit 0x00007fff8d254287 -[NSBinder setValue:forBinding:error:] + 245
11 AppKit 0x00007fff8d74c4ee -[NSValueBinder _applyObjectValue:forBinding:canRecoverFromErrors:handleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:] + 194
12 AppKit 0x00007fff8d74c871 -[NSValueBinder applyDisplayedValueHandleErrors:typeOfAlert:canRecoverFromErrors:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:error:] + 621
13 AppKit 0x00007fff8d74c9d4 -[NSValueBinder _applyDisplayedValueIfHasUncommittedChangesWithHandleErrors:typeOfAlert:discardEditingCallback:otherCallback:callbackContextInfo:didRunAlert:error:] + 127
14 AppKit 0x00007fff8d253c2e -[NSValueBinder validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:] + 436
15 AppKit 0x00007fff8d253a57 -[_NSBindingAdaptor _validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:bindingAdaptor:] + 160
16 AppKit 0x00007fff8d25399d -[_NSBindingAdaptor validateAndCommitValueInEditor:editingIsEnding:errorUserInterfaceHandled:] + 260
17 AppKit 0x00007fff8d25e0ba -[NSTextField textShouldEndEditing:] + 402
18 AppKit 0x00007fff8d25dc63 -[NSTextView(NSSharing) resignFirstResponder] + 393
19 AppKit 0x00007fff8d136170 -[NSWindow makeFirstResponder:] + 455
20 ResponderExperiment 0x000000010000154c -[WMWindow makeFirstResponder:] + 172
21 AppKit 0x00007fff8d25c778 -[NSTextView(NSPrivate) _giveUpFirstResponder:] + 257
22 AppKit 0x00007fff8d25c56c -[NSTextView(NSKeyBindingCommands) insertTab:] + 270
23 AppKit 0x00007fff8d22dc2f -[NSResponder doCommandBySelector:] + 71
24 AppKit 0x00007fff8d25b10a -[NSTextView doCommandBySelector:] + 196
25 AppKit 0x00007fff8d22d151 -[NSKeyBindingManager(NSKeyBindingManager_MultiClients) interpretEventAsCommand:forClient:] + 1392
26 AppKit 0x00007fff8d24c1c2 -[NSTextInputContext handleEvent:] + 845
27 AppKit 0x00007fff8d22b9dd -[NSView interpretKeyEvents:] + 180
28 AppKit 0x00007fff8d24bd6d -[NSTextView keyDown:] + 658
29 AppKit 0x00007fff8d1f856b -[NSWindow sendEvent:] + 1843
30 AppKit 0x00007fff8d199b32 -[NSApplication sendEvent:] + 3395
31 AppKit 0x00007fff8cfe99f9 -[NSApplication run] + 646
32 AppKit 0x00007fff8cfd4783 NSApplicationMain + 940
33 ResponderExperiment 0x0000000100002de2 main + 34
34 libdyld.dylib 0x00007fff8c5bf5fd start + 1
35 ??? 0x0000000000000003 0x0 + 3
)
那么也许我可以编写自己的 NSArrayControllerrearrangeObjects: 方法,该方法不会失去焦点?
最佳答案
这是一个可能的解决方案。这个想法是将文本字段(或者更准确地说,为文本字段提供服务的字段编辑器)对 Tab 键的响应重新实现为两个单独的步骤。首先,结束编辑,这将使阵列 Controller 重新排列其内容。我们通过重置焦点来结束编辑,因此我们不关心阵列 Controller 可能会做什么来获得焦点。然后,我们自己将焦点从最初聚焦的文本字段移开。
在您的文本字段上设置委托(delegate)。在该委托(delegate)中,实现以下方法:
- (BOOL) control:(NSControl*)control textView:(NSTextView*)textView doCommandBySelector:(SEL)command
{
if (command == @selector(insertTab:))
{
// End editing. This will commit the edited value and cause the array controller
// to rearranged its contents.
[control.window makeFirstResponder:nil];
// This will put focus on the next control from the text field.
[control.window selectKeyViewFollowingView:control];
// Prevent the normal processing of this command
return YES;
}
if (command == @selector(insertBacktab:))
{
// End editing. This will commit the edited value and cause the array controller
// to rearranged its contents.
[control.window makeFirstResponder:nil];
// This will put focus on the previous control from the text field.
[control.window selectKeyViewPrecedingView:control];
// Prevent the normal processing of this command
return YES;
}
return NO;
}
有一件事我不确定:如果您单击另一个文本字段而不是远离文本字段,会发生什么。在这种情况下,阵列 Controller 是否仍会重置焦点?
关于cocoa - 当启用 NSArrayController“自动重新排列内容”时,插入和编辑新对象后键盘焦点丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25311016/
正在完成我的第一个 Cocoa OS X 项目,其中我获取远程 XML 数据并将对象存储在 NSMutableArray 中。 今天,当我在项目中第一次打开IB时,我发现了对象NSArrayContr
我是 Objective-C 的新手,到目前为止我很喜欢它。然而,我似乎在兜圈子。我试图在不编写代码的情况下做尽可能多的事情。是否可以有效地将一个 NSArrayController 的内容集绑定(b
我有一个简单的 NSArrayController 连接到我的 coreData 模型之一。我可以轻松地显示 NSTableView 中的所有项目,没有问题,但是,如果我尝试将包含 NSPopUpBu
在我的 MainController 中,有一个 Person 数组,它绑定(bind)到 NSArrayController。人员姓名显示在表name 列中。如果我将一个按钮绑定(bind)到 NS
我有一个连接到 NSManagedObjectContext 的 NSArrayController。此外,我有一个 NSTableView,其内容和选择索引绑定(bind)到所述 NSArrayCo
我正在 Xcode 控制台中检查 NSArrayController 的数量,我得到了这个: (lldb)po [_myArrayAC.content count] nil 但是如果我尝试检查该值是
我在使用 NSArrayController rearrangeObjects 函数时遇到了麻烦 - 该函数是从某些后台步骤调用的,有时应用程序会因错误而崩溃:“endUpdates 在没有 begi
我刚刚意识到有两种方法可以使用 NSArrayController。 将 Controller 绑定(bind)到数组并向数组添加对象。或者根本不使用任何数组,直接将对象添加到 Controller
我正在开发一个 Mac 应用程序,并且正在努力让谓词过滤器正常工作。对于 NSArrayController,使用 fetch 与过滤谓词的方式有什么不同吗? 我正在使用 Core Data 来存储我
我想使用 NSArrayController 向 NSTableView 提供数据。我面临的问题是我不想将所有数据预先加载到数组中,然后使用数组 Controller setContent: 方法。我
我有一个示例项目 https://github.com/ericgorr/LazyFetching 设置非常简单。在我的 CoreData 模型中,我有两个实体: 具有 name 属性和与 Item
非常简单的问题让我抓狂:以编程方式清除 NSArrayController 选择的正确方法是什么? 我正在设计一个包含以下组件的 View : NSArrayController *controlle
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我正在努力将通过拖放(文件从 finder 到 NSView)接收到的变量传递给 AppDelegate 中的 NSArrayController。 NSView 接收拖放: class MyView
我在我的 OS X 应用程序中使用 Core Data,我将一些 TableViews 绑定(bind)到 NSArrayControllers。我遇到的问题是,当我尝试使用数组 Controller
我在过滤 NSArrayController 时遇到问题。内容数组绑定(bind)到一个包含 NSDictionaries 的 NSMutableArray。我想过滤所有“名称”键等于“a”的 NSD
我有一个 NSArrayController,其内容是我的 AppDelegate 的“servers”属性。 我有一个 NSTextField ,它绑定(bind)到 NSArrayControll
我有一个链接到核心数据模型的 NSArrayController 子类。在我调用的方法之一中 [self performSelectorInBackground:@selector(someLongE
也许我不明白如何正确使用 NSArrayController,但这是我的情况。 我的实体设置如下:帐户 -> 文件夹 -> 聊天。因此,我将针对特定文件夹实体进行大量聊天。我希望我的数组 Contro
我有一个 NSArrayController,它返回一个 NSManagedObjects 数组,但是我只对在 NSTableView 中显示这些对象的某些属性感兴趣,并且不需要所有这些属性。有没有办
我是一名优秀的程序员,十分优秀!