如果不是初始视图控制器,则向第一响应者发送操作不起作用

Posted

技术标签:

【中文标题】如果不是初始视图控制器,则向第一响应者发送操作不起作用【英文标题】:Send action to first responder doesn't work if it's not Initial View Controller 【发布时间】:2015-06-12 02:06:24 【问题描述】:

我正在尝试在这里创建类似于 SpringApp 中的代码菜单的滑动菜单(参见 CodeViewController):

https://github.com/MengTo/Spring/blob/master/SpringApp

只要 SpringViewController 是初始视图控制器,它就可以正常工作。

如果我创建另一个 ViewController 并将其设为初始值,则永远不会调用最小化视图/最大化视图:

UIApplication.sharedApplication().sendAction("minimizeView:", to: nil, from: self, forEvent: nil)

在此方法中,“to:”设置为 nil 以使用第一响应者。所以看起来当 SpringViewController 不再是初始视图控制器时,它不再是第一响应者。

如何修复它以使 SpringViewController 中定义的 minimizeView 和 minimizeView 操作始终有效?

【问题讨论】:

【参考方案1】:

我找到了使用通知中心的解决方法。

在 SpringViewController 中添加:

override func viewDidLoad() 
  super.viewDidLoad()

  // Add observer in notification center
  // It receives notifications from menu
  NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "minimizeView:",
    name: "minimizeView",
    object: nil)
  NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: "maximizeView:",
    name: "maximizeView",
    object: nil)
  

在 OptionsViewController 中:

  override func viewDidAppear(animated: Bool) 
    super.viewDidAppear(true)
    // skipped ...
    // Post notification
    NSNotificationCenter.defaultCenter().postNotificationName("minimizeView", object: nil)
  

@IBAction func closeButtonPressed(sender: AnyObject) 
    // skipped...
    // Post notification
    NSNotificationCenter.defaultCenter().postNotificationName("maximizeView", object: nil)
    // skipped...

这使得最大化视图和最小化视图正常工作。我想知道第一响应者的方法是否更好。

【讨论】:

以上是关于如果不是初始视图控制器,则向第一响应者发送操作不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果不是第一响应者,为啥我可以单击 NSButton?

如何在项目中间使用显示视图控制器而不是初始视图控制器

从另一个视图控制器中退出第一响应者

Subview 不会成为第一响应者

如果应用程序在前台,则向状态栏发送通知

部分视图与 Json(或两者)