我有一个Cocoa应用程序,有一个NSWindowController控制NSWindow与NSComboBox它.没什么特别的,它在升级到OS X 10.7.2之前工作正常.现在我得到以下异常,当窗口控制器的窗口加载时,该异常只发生一次.(由于我的应用程序中的窗口控制器仍然加载,每次应用程序启动时只会发生一次.)随后聚焦和取消聚焦组合框不会触发它.
任何人都知道10.7.2中是否有变化,如果有变化,如何解决它?
(这与Xcode 4.2一起发生.)
2011-10-24 11:30:21.649 MyApp[7934:707] Unlocking Focus on wrong view ((null)), expected <NSComboBox: 0x40083d6e0>
2011-10-24 11:30:21.653 MyApp[7934:707] (
0 CoreFoundation 0x00007fff8412d286 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff88cdad5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff8412d0ba +[NSException raise:format:arguments:] + 106
3 CoreFoundation 0x00007fff8412d044 +[NSException raise:format:] + 116
4 AppKit 0x00007fff8c76c1d5 -[NSFocusStack unfocusView:] + 194
5 AppKit 0x00007fff8c7e838e +[_NSAutomaticFocusRing showForView:] + 2545
6 AppKit 0x00007fff8cdbb4d1 __postActiveFirstResponderChanged_block_invoke_1 + 32
7 CoreFoundation 0x00007fff840ecf37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 …Run Code Online (Sandbox Code Playgroud) 我在视图控制器(UIViewController的自定义子类)中处理了几个我的UI组件.它的方法touchesBegan:withEvent:,touchesMoved:withEvent:和touchesEnded:withEvent:.它工作正常.然后我添加了一个滚动视图(UIScrollView)作为层次结构中的顶视图.
现在我在视图控制器上的触摸处理程序不起作用.他们没有被召唤.有趣的是,我在滚动视图中有各种其他UI组件可以正常工作.有些是按钮,有些是定义自己的自定义视图touchesBegan:withEvent:等.唯一不起作用的是视图控制器上的触摸处理程序.
我想也许是因为滚动视图拦截为己用的触动,但我UIScrollView的子类,只是看看,如果我能得到它的工作,我回来YES总是touchesShouldBegin:withEvent:inContentView:和NO来自始终touchesShouldCancelInContentView:.仍然无法正常工作.
如果它有所作为我的视图控制器在标签栏控制器内,但我不认为它是相关的.
有没有人有这个问题并有一个现成的解决方案?我的猜测是滚动视图猴子响应者链.我可以回来吗?我想如果我无法想出任何其他内容,我会将滚动视图下的顶级视图设为自定义视图,并将消息转发给视图控制器,但看起来很糟糕.
我在基于文档的架构的单个窗口中做了一些疯狂的多个文档,我完成了95%.
我有这种双层文档架构,其中父文档打开并配置窗口,提供"子"文档列表.当用户选择其中一个子项时,该文档使用相同的窗口控制器打开,并在窗口中放置一个NSTextView.窗口控制器的文档关联被更改,以便"编辑的点"和窗口标题跟踪当前选择的文档.想想Xcode项目以及编辑其中的不同文件时会发生什么.
要以伪表格形式放置代码,在打开子文档时,会在父文档中调用此类方法.
-(void)openChildDocumentWithURL:(NSURL *)documentURL {
// Don't open the same document multiple times
NSDocument *childDocument = [documentMapTable objectForKey:documentURL];
if (childDocument == nil) {
childDocument = [[[MyDocument alloc] init] autorelease];
// Use the same window controller
// (not as bad as it looks, AppKit swaps the window's document association for us)
[childDocument addWindowController:myWindowController];
[childDocument readFromURL:documentURL ofType:@"Whatever" error:NULL];
// Cache the document
[documentMapTable setObject:childDocument forKey:documentURL];
}
// Make sure the window controller gets the document-association swapped if the doc …Run Code Online (Sandbox Code Playgroud) NSResponder似乎没有鼠标双击事件.是否有一种简单的方法来捕获双击?
我正在使用NSView的自定义子类并通过keyDown/keyUp方法接收键盘事件,一切正常,除非按下"Cmd⌘"键,keyDown事件正常触发,但keyUp事件永远不会到来.
在我们的例子中,我们使用自己的箭头键向左/向右/向上/向下移动图像,如果用户在按住左/右按住"Cmd⌘"的同时,它将旋转图像.由于我们得到了keyDown事件,因此图像开始旋转,但它永远不会因为keyUp永远不会停止而停止.其他修饰符没有这个问题(例如,如果按住shift,ctrl或alt而按下另一个键,我们会按预期获得keyUp).一种选择是使用不同的修饰符,但保持它与PC版本一致会很好(Cmd用作Windows上使用Ctrl时的替代,使其与标准复制/粘贴命令保持一致等).
有谁知道为什么这样做?感觉就像一个bug,但可能只是奇怪的"正确行为",任何想法如何绕过它(除了使用替代修饰符或使用直接HID访问之类的东西).
谢谢.
我很难理解和查找有关如何使NSViewController接受键和鼠标事件的信息.我在某处读到,为了在NSViewController中注册这些事件,它应该被添加到响应者链中,但我找不到如何正确执行此操作的答案.
任何形式的帮助都非常感谢!
是否可以使validateMenuItem与NSViewControllers一起使用?文档说NSViewController是NSResponder的子类,所以我认为它会参与响应者链,但我从来没有能够让它工作.我可以使用NSView,没问题.
我的特定用例是MainMenu.xib中的一个菜单项,它连接到First Responder.我的视图控制器子类中的选择器显示在MainMenu的第一响应者弹出的选择器列表中,所以我认为它可以工作,但事实并非如此.我的子类的validateMenuItem方法永远不会被调用.(调用app委托中的那个,但不是连接到First Responder的项目.)
我在主应用程序菜单中有一个菜单项,我想将其动作路由到视图控制器(NSViewController).界面层次结构如下所示:有一个主应用程序窗口控制器NSWindowController.在窗口内部有一个分割视图,分割视图中的右视图由分割视图控制NSViewController.
Window + NSWindowController
`-- NSSplitView
`-- NSView
`-- NSView + NSViewController
Run Code Online (Sandbox Code Playgroud)
菜单项连接到Interface Builder中的First Responder.有问题的视图控制器实现了适当的方法,但菜单项保持禁用状态.当我将方法移动到NSWindowController,菜单项被启用.
我想我需要将视图控制器放到响应器链中,所以我将其设置nextResponder为窗口控制器; 没有雪茄.我究竟做错了什么?
我正在尝试复制iTunes中搜索字段的行为,以查找股票代码和名称.具体来说,当您开始在搜索字段中键入时,会显示带有过滤项的弹出窗口.在大多数情况下,我有这个工作,但我无法复制的是它处理第一响应者的方式
输入三个字符后,我出现了弹出窗口.此时,NSSearchField将失去第一响应者状态,因此我无法继续键入.我想要的行为是能够在弹出窗口后继续键入,如果使用箭头键滚动项目,然后继续键入,您将从搜索字段中的最后一个字符继续.
我尝试的是子类化NSTextView(使用它作为NSSearchField的自定义字段编辑器)和覆盖
- (BOOL)resignFirstResponder
Run Code Online (Sandbox Code Playgroud)
通过简单地返回NO,我可以在弹出框出现后继续输入,但显然我无法选择弹出窗口中的任何项目.所以我尝试了以下操作,如果出现向下箭头或mousedown事件,则返回YES.
@interface SBCustomFieldEditor ()
{
BOOL resignFirstRepond;
}
@end
@implementation SBCustomFieldEditor
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
resignFirstRepond = NO;
}
return self;
}
- (BOOL)resignFirstResponder
{
return resignFirstRepond;
}
- (void)keyDown:(NSEvent *)theEvent
{
if ([theEvent keyCode] == 125) {
resignFirstRepond = YES;
[self resignFirstResponder];
}
[super keyDown:theEvent];
}
- (void)mouseDown:(NSEvent *)theEvent
{
resignFirstRepond = YES;
[self resignFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
这适用于mousedown事件,但不适用于keydown事件,此外,当用户恢复键入时,这不能解决问题.
有什么建议?
我将子类化为NSView并在应用程序完成启动时启动全屏模式.该视图作为fooView应用程序委托中的属性提供.
// AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification*)notification {
[[self window] makeKeyAndOrderFront:self];
[[self fooView] enterFullScreenMode:[NSScreen mainScreen] withOptions:nil];
}
Run Code Online (Sandbox Code Playgroud)
该类FooView本身实现了以下功能.
// FooView.m
- (void)keyDown:(NSEvent*)event {
NSLog(@"%@ %@ - %@", self.className, NSStringFromSelector(_cmd), event);
[self interpretKeyEvents:[NSArray arrayWithObject:event]];
}
- (void)cancelOperation:(id)sender {
NSLog(@"%@ %@ - %@", self.className, NSStringFromSelector(_cmd), sender);
[self exitFullScreenModeWithOptions:nil];
}
Run Code Online (Sandbox Code Playgroud)
离开全屏模式后,视图不再接收键盘事件.为什么?
编辑:
这似乎与我退出全屏模式的方式有关.当我点击视图(而不是窗口)时,keyDown:并cancelOperation:在下面做出响应.
nsresponder ×10
cocoa ×7
macos ×6
objective-c ×3
nsmenuitem ×2
nsview ×2
double-click ×1
fullscreen ×1
iphone ×1
keyup ×1
nsdocument ×1
nsevent ×1
nspopover ×1
nswindow ×1
osx-lion ×1
touch ×1
uiscrollview ×1
xcode4.2 ×1