为什么@IBAction 在启动时自动调用?

Why is @IBAction automatically called on launch?

如果您创建一个新的 Cocoa 项目并将 NSTextField 对象库 拖放到您的视图控制器,这是您启动时的初始控制器,并同时创建一个 @IBAction(在其中添加 print(called))和 @IBOutlet,以及 运行 应用程序,然后您看不到调用的 @IBAction 方法启动时。

然后,如果您在文本字段上按 return,就会调用该操作。然而,这很重要,在您退出应用程序然后再次启动应用程序后,您现在会看到 @IBAction 由于某些原因在启动时被调用(如果没有,请尝试几次次)。

其实我想知道为什么在我的开发应用程序启动时总是调用@IBAction,并在我的所有类中搜索任何调用它的方法,但后来发现这个奇怪的问题发生了甚至当我开始一个新项目并创建一个连接,并尝试启动和发送操作时反复试验几次。

我还注意到我创建了五个新项目并确认这五个项目都发生了这种情况。

为什么会出现这种情况?另外,如果这是 Apple 方面的错误,有没有办法在我的项目中禁用 @IBAction 的自动执行?

我一开始设置了textField.editable = false,在viewDidAppear:中设置为textField.editable = true,但还是一启动就触发了动作。有什么办法可以解决这个问题吗?


似乎如果我通过点击红色图标并退出应用程序来关闭 window,然后从 Xcode 中再次启动它,那么 @IBAction 不会叫。这太奇怪了...

这似乎与 OS X 上的 window 恢复有关。

当视图加载时,您的文本字段被设置为第一响应者。然后,在恢复期间,window 成为第一响应者。这会导致文本字段退出第一响应者,从而触发一个动作。

在 IB 中,您可以将文本字段的操作设置为 "Send on enter only"。 (默认为 "end editing"。)

或者,如果您愿意,可以使 window 不可恢复。