swift - 为什么我的视图控制器不接受按键输入?
问题描述
我的故事板文件中有以下测试设置:
我希望发生以下事情:
- Window 1打开时按任意键打印一条消息
- 按下下一步按钮时打开窗口 2
- 将变量从ViewController传递到SecondViewController
- Window 2打开时按任意键打印消息
这是我使用的代码:
在ViewController.swift中:
import Cocoa
class ViewController: NSViewController {
var foo = 3
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func keyUp(with event: NSEvent) {
print("Key Pressed!")
}
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
if segue.identifier?._rawValue == "segue" {
if let destination = segue.destinationController as? SecondViewController {
destination.foo = foo
}
}
}
}
在SecondViewController.swift 中:
import Cocoa
class SecondViewController: NSViewController {
var foo = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
print(foo)
}
override func keyUp(with event: NSEvent) {
print("Key Pressed!")
}
}
当我运行它时,会发生以下情况:
- 在ViewController中没有调用按键打印方法
- 在SecondViewController中未调用按键打印方法
- SecondViewController中第一个 print 方法打印的值为 0,表示变量没有从ViewController传递到SecondViewController
这些是我自己得出的结论:
该变量没有从第一个控制器传递到第二个控制器,因为 segue 在ViewController和Window2之间而不是SecondViewController之间。但是,当我将 segue 从ViewController更改为SecondViewController时,显示SecondViewController的窗口不会从Window 2获取属性。我不知道如何在视图控制器之间发送变量以及同时为显示这些控制器的窗口设置属性。
至于按键,我不知道为什么它不起作用。每当我在打开任一窗口时按下某个键时,我都会听到错误声音。我已经尝试通过调用self.becomeFirstResponder()手动将视图控制器设置为两个控制器中viewDidLoad()方法中的第一响应者,但这没有任何区别。我在网上搜索过,但没有找到任何描述或讨论类似问题的信息、文档或文献。
最后,这篇文章可以提炼成两个问题:
1 | 如何在视图控制器之间发送变量,同时仍然保持窗口控制器的属性?
2 | 如何在多个窗口中正确处理按键?
谢谢您的帮助
解决方案
推荐阅读
- javascript - 有一个按钮来控制时间线 GSAP 动态定位增量计数器
- python - Selenium 找不到链接的元素
- docker - 当 env 中未设置变量时,docker-compose 在随机端口上公开
- java - Bouncy Castle - 如何从 JceOpenSSLPKCS8DecryptorProviderBuilder 获取公钥信息
- bash - grep 文件列表中的最后一个匹配项
- javascript - 一步一步匹配句子的正则表达式
- php - 未定义变量:posts(查看:/home/.../annonces/resources/views/welcome.blade.php)
- apache-spark - 将多列映射到 Spark 数据框中的单个键
- requiredfieldvalidator - 用于验证文本框条目的 Javascript 代码
- ios - 如何在 Swift 中导航共享扩展以托管应用程序?