问题标签 [responder-chain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
323 浏览

macos - NSApp.sendAction() 仅在一段时间后才有效

我希望 ViewController ( ContainerVC ) 对子自定义视图 ( ChildView )的点击做出反应。

ChildView中,我重写mouseDown(_:)以处理点击。在这种方法中,我尝试通过调用ContainerVC目标NSApp.sendAction(#selector(ContainerVC.childViewClicked(_:)), to: nil, from: self)

由于某种原因,该sendAction方法首先失败(即返回 false)。也NSApp.target(forAction: #selector(ContainerVC.childViewClicked(_:))为零。

一段时间后(通常是在我疯狂地点击自定义视图一段时间后),目标得到解决,一切正常,ContainerVC.childViewClicked(_:) 被调用。

在目标得到解决的时间/多少次点击之后,我找不到系统模式(除了我对着我的 mac 大喊大叫的强度)。

有趣的是,当通过let window = NSWindow(contentViewController: ContainerVC()).

当我将ContainerVC添加到拆分视图时,会发生上述奇怪行为:

我检查了CustomView的响应者链。ContainerVC按预期出现在链中。链中没有其他类实现childViewClicked(_:)

如果有人能告诉我 NSApp.sendAction(_:) 的内部工作原理以及为什么最初的目标为零,我将不胜感激。

将 ViewController 添加到 SplitView 以正确连接事物时是否需要额外的步骤?

0 投票
1 回答
302 浏览

ios - 响应链错误

我想将这种 Objective-C 代码翻译成 Swift:

我遇到了一些麻烦。

代码仓库


苹果文档:下一个

宣言

var next: UIResponder?{ 得到 }

返回值

响应者链中的下一个对象,如果这是链中的最后一个对象,则为 nil。

距离

我想在右 viewController 中访问左 tarBarController。

类 ViewControllerEightLayer

// 正确的 viewController。

我在这里调用它,这是错误信息:

线程 1:致命错误:在展开可选值时意外发现 nil

类LayerTableVC

// 中心稍微向右 UITableViewController.

类LayerNavigationVC

// 中心向左一点 UINavigationController.

类 MainTabBarVC

// 左边的 tarBarController

我不知道如何以这种方式解决它。有什么建议么?


也许它有帮助,

似乎是有线的。


我是通过代码做到的,

而我想知道响应者链的解决方案


PS:

挖掘响应者链的目的是好奇心。

它发生了,我不认为它会发生。

所以我想知道为什么。

我想进行逆向工程。


PP:

我的意图是控制工具栏的隐藏和显示。不提供数据

这是一个个人实验项目,不是我公司的。

0 投票
1 回答
229 浏览

swift - NSWindow 在关闭 NSPopover 后失去了第一响应者

我有一个窗口,它显示一个带有一堆文本字段的弹出窗口。我希望这些文本字段在弹出框出现时是可选项卡但不集中的。为了实现这一点,我将第一响应者设置为nil弹出框出现的时间:

这工作正常,直到弹出框被解除导致拥有窗口的第一响应者被设置为窗口本身,而不是在弹出框出现之前是第一响应者的视图。但是,如果我self.view.window!.makeFirstResponder(self.view)在上面的块中完全触摸或不触摸第一响应者,一切都会按预期工作,并且当弹出框被解除时,拥有窗口的第一响应者会正确恢复。

据我所知,popover 内部的变化不应该影响拥有的窗口,因为 popover 有自己的窗口和自己的响应者链。

我很好奇幕后发生了什么。很确定这取决于响应者链的工作方式和更新方式,但我无法连接这些点。

–––</p>

谁能解释为什么在弹出nil窗口被解除时更改弹出窗口内的第一响应者以弄乱拥有窗口(在其上方显示)的第一响应者?并且在使用上述解决方法时不会影响它?

0 投票
1 回答
36 浏览

ios - 如何从 tableview 框架中调用 tableview 单元格单击事件?

当我触摸到tableview框架之外的点时,有没有办法调用tableview委托函数-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

我已经尝试覆盖 tableview 的 superview-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event并更改点并让事件继续传递给 tableview 和 tableview 的子视图。只需滚动事件工作但单击事件。

这是一个演示项目

0 投票
1 回答
74 浏览

ios - UIButton 不响应触摸事件

我有一个 UIButton 不响应触摸事件。而且该按钮只有一些不处理事件的子视图。所以我用我定制的 UIButton 替换了它,以了解发生了什么。下面是我的代码:

我发现该touchesBegan:withEvent:方法已被调用,但从beginTrackingWithTouch:withEvent:未被调用。似乎该事件已发送到我的按钮,但我不明白为什么从未跟踪过该事件。任何线索将不胜感激。

0 投票
1 回答
106 浏览

ios - iOS:如何实现遮罩视图事件穿透?

如下图,我有一个collectionView,上面有一个maskView。以及 maskView 上方的右侧视图。

图像

如何实现遮罩视图事件穿透?</p>

我的 PM 的想法是,当 collectionView 上方的掩码视图时,collectionViewCell 是可点击的。(有点奇怪)

掩码视图已经接管了 collectionView 的事件。

我想我应该覆盖事件响应者链。

我试图处理override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?

没有按命令工作,collectionView 只是滚动。

如何解决?


我稍微改进了代码。

它不是很锋利。切换单击的单元格时会放弃某些事件。就像 Apple 做了一个 hitTest 事件缓存一样。

0 投票
2 回答
151 浏览

swift - macOS - 如果应用程序未处于活动状态,菜单操作不会触发任何操作

我正在构建这个将位于菜单栏上的应用程序。

因此,就像通常使用此类应用程序所做的那样,您将 statusItem 菜单调整为您的应用程序的菜单。

该菜单上的项目触发第一响应者的操作,在我的例子中是该应用程序的 viewController。

这就是问题所在:如果应用程序处于活动状态,则此方法有效,但如果应用程序未处于活动状态或隐藏状态,则会失败。我猜菜单项触发的操作会触发到响应者链,但没有人在听,因为应用程序被隐藏或未激活。

在这种情况下我该怎么办?我应该创建一个单例并将该单例添加到响应者链中吗?我说单例是因为它总是会加载到内存中。这个单例必须是某个特殊类的子类吗?

如果此菜单中的操作应该触发 viewController 中的内容,该怎么办?

0 投票
0 回答
28 浏览

swift - 如何从菜单项中调用自定义 NSView IBActions?

我有一个 NSViewController 将自定义 NSView 作为子视图添加到视图控制器视图。我想通过 First Responder 对象使该自定义视图的 IBAction 方法可调用,但始终禁用连接到自定义视图的相应 IBAction 的菜单项。

我怀疑原因是自定义的 NSView 没有自动添加到响应者链中。我应该怎么做,因为将完全相同的 IBActions 添加到我的视图控制器只是为了在自定义 NSView 中调用相同的 IBActions 不是很优雅?

0 投票
0 回答
26 浏览

cocoa - 处理 keyDown: NSSplitView 中的事件的正确设计模式是什么?

我想在一个复杂的基于拆分视图的窗口中为每个不同的子视图有单独的 KeyDown: 处理程序。此外,我希望在 WindowController 级别有一个“全局” KeyDown: 处理程序,用于未由各个子视图处理程序处理的任何键。

根据我对 NSResponder 文档的理解,我应该能够执行以下操作:(在伪代码中 - 请不要抱怨语法。我正在写这个 Forth 但我认为 Objective-C 风格的伪代码会得到这个想法在这里更好。)

但是未处理的键不会像我预期的那样将响应者链向上传播到 WindowController。看起来链条在 ViewController 处停止。

我在这里想念什么?

谢谢


(伪代码)

0 投票
1 回答
51 浏览

uistackview - 为什么嵌套视图中的 UILabel 不接收触摸事件/如何测试响应者链?

我发现了很多关于不接收触摸事件的类似问题,我知道在某些情况下,可能需要编写自定义的 hitTest 函数——但我还读到响应者链将遍历层次结构中的视图和视图控制器——我不明白为什么我的实现需要自定义 hitTest。

我正在寻找解释和/或指向解释如何测试响应者链的文档的链接。此问题出现在 Xcode 10.2.1 中。

我的场景(我没有使用情节提要):

  • 我有一个 mainViewController,它提供了一个带有 ImageView 和一些标签的全屏视图。我已将 TapGestureRecognizers 附加到 ImageView 和其中一个标签上——它们都可以正常工作。
  • 当我点击标签时,我添加了一个子视图控制器,它作为主视图控制器的子视图。视图被限制为仅覆盖屏幕的右半部分。
  • 子 viewController 包含一个垂直堆栈视图,其中包含 3 个排列的子视图。
  • 每个排列的Subview 都包含一个 Label 和一个水平 StackView。
  • 水平 stackView 的每一个都包含一个带有标签的视图作为子视图。
  • 子视图中的 Label 将其 isUserInteractionEnabled 标志设置为 True 并添加 TapGestureRecognizer。
  • 这些是子 ViewController 中唯一设置了“isUserInteractionEnabled”的对象。

标签嵌套得相当深,但由于这是直接的父/子层次结构(与属于 NavigationController 的 2 个视图相反),我希望标签位于正常的响应程序链中并正常运行。Stack View 会改变这种行为吗?我是否需要在某些视图上将“isUserInteractionEnabled”值显式设置为 False?有没有办法可以将日志记录添加到 ResponderChain,以便我可以查看它检查了哪些视图并找出它被阻止的位置?

在阅读了这篇 StackOverflow 帖子后,我尝试在 viewDidLayoutSubviews() 中添加我的手势识别器,而不是如下所示 - 但它们仍然没有收到点击事件。

提前感谢任何可以提供建议或帮助的人。

这是不响应我的点击事件的标签的代码以及它应该调用的点击事件: