标签: nsresponder

在OS X 10.7.2下解锁焦点错误视图((null))

我有一个Cocoa应用程序,有一个NSWindowController控制NSWindowNSComboBox它.没什么特别的,它在升级到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)

nswindow nsresponder xcode4.2 osx-lion

53
推荐指数
1
解决办法
1192
查看次数

UIScrollView阻止了视图控制器上的touchesBegan,touchesMoved,touchesEnded

我在视图控制器(UIViewController的自定义子类)中处理了几个我的UI组件.它的方法touchesBegan:withEvent:,touchesMoved:withEvent:touchesEnded:withEvent:.它工作正常.然后我添加了一个滚动视图(UIScrollView)作为层次结构中的顶视图.

现在我在视图控制器上的触摸处理程序不起作用.他们没有被召唤.有趣的是,我在滚动视图中有各种其他UI组件可以正常工作.有些是按钮,有些是定义自己的自定义视图touchesBegan:withEvent:等.唯一不起作用的是视图控制器上的触摸处理程序.

我想也许是因为滚动视图拦截为己用的触动,但我UIScrollView的子类,只是看看,如果我能得到它的工作,我回来YES总是touchesShouldBegin:withEvent:inContentView:NO来自始终touchesShouldCancelInContentView:.仍然无法正常工作.

如果它有所作为我的视图控制器在标签栏控制器内,但我不认为它是相关的.

有没有人有这个问题并有一个现成的解决方案?我的猜测是滚动视图猴子响应者链.我可以回来吗?我想如果我无法想出任何其他内容,我会将滚动视图下的顶级视图设为自定义视图,并将消息转发给视图控制器,但看起来很糟糕.

iphone touch uiscrollview viewcontroller nsresponder

26
推荐指数
2
解决办法
2万
查看次数

如何检查响应链?

我在基于文档的架构的单个窗口中做了一些疯狂的多个文档,我完成了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)

macos cocoa objective-c nsdocument nsresponder

21
推荐指数
3
解决办法
8092
查看次数

在Cocoa OSX中双击

NSResponder似乎没有鼠标双击事件.是否有一种简单的方法来捕获双击?

macos cocoa double-click nsresponder

17
推荐指数
4
解决办法
8136
查看次数

当Cmd⌘键按下时,NSResponder未收到keyUp事件

我正在使用NSView的自定义子类并通过keyDown/keyUp方法接收键盘事件,一切正常,除非按下"Cmd⌘"键,keyDown事件正常触发,但keyUp事件永远不会到来.

在我们的例子中,我们使用自己的箭头键向左/向右/向上/向下移动图像,如果用户在按住左/右按住"Cmd⌘"的同时,它将旋转图像.由于我们得到了keyDown事件,因此图像开始旋转,但它永远不会因为keyUp永远不会停止而停止.其他修饰符没有这个问题(例如,如果按住shift,ctrl或alt而按下另一个键,我们会按预期获得keyUp).一种选择是使用不同的修饰符,但保持它与PC版本一致会很好(Cmd用作Windows上使用Ctrl时的替代,使其与标准复制/粘贴命令保持一致等).

有谁知道为什么这样做?感觉就像一个bug,但可能只是奇怪的"正确行为",任何想法如何绕过它(除了使用替代修饰符或使用直接HID访问之类的东西).

谢谢.

macos cocoa nsview nsresponder keyup

12
推荐指数
1
解决办法
976
查看次数

如何将NSViewController添加到响应者链?

我很难理解和查找有关如何使NSViewController接受键和鼠标事件的信息.我在某处读到,为了在NSViewController中注册这些事件,它应该被添加到响应者链中,但我找不到如何正确执行此操作的答案.

任何形式的帮助都非常感谢!

macos cocoa objective-c nsviewcontroller nsresponder

11
推荐指数
3
解决办法
7533
查看次数

NSViewController上的validateMenuItem

是否可以使validateMenuItem与NSViewControllers一起使用?文档说NSViewController是NSResponder的子类,所以我认为它会参与响应者链,但我从来没有能够让它工作.我可以使用NSView,没问题.

我的特定用例是MainMenu.xib中的一个菜单项,它连接到First Responder.我的视图控制器子类中的选择器显示在MainMenu的第一响应者弹出的选择器列表中,所以我认为它可以工作,但事实并非如此.我的子类的validateMenuItem方法永远不会被调用.(调用app委托中的那个,但不是连接到First Responder的项目.)

macos cocoa nsviewcontroller nsmenuitem nsresponder

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

如何将菜单操作路由到窗口内的NSViewController?

我在主应用程序菜单中有一个菜单项,我想将其动作路由到视图控制器(NSViewController).界面层次结构如下所示:有一个主应用程序窗口控制器NSWindowController.在窗口内部有一个分割视图,分割视图中的右视图由分割视图控制NSViewController.

Window + NSWindowController
    `-- NSSplitView
           `-- NSView
           `-- NSView + NSViewController
Run Code Online (Sandbox Code Playgroud)

菜单项连接到Interface Builder中的First Responder.有问题的视图控制器实现了适当的方法,但菜单项保持禁用状态.当我将方法移动到NSWindowController,菜单项被启用.

我想我需要将视图控制器放到响应器链中,所以我将其设置nextResponder为窗口控制器; 没有雪茄.我究竟做错了什么?

macos cocoa nsmenuitem nsresponder

7
推荐指数
1
解决办法
2361
查看次数

如何处理第一响应者和NSPopover

我正在尝试复制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事件,此外,当用户恢复键入时,这不能解决问题.

有什么建议?

cocoa nsevent nsresponder nspopover

7
推荐指数
1
解决办法
1849
查看次数

退出全屏模式后如何接收NSView的键盘事件?

我将子类化为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:在下面做出响应.

objective-c fullscreen keyboard-events nsview nsresponder

5
推荐指数
1
解决办法
3314
查看次数