【问题标题】:UITabBarController canBecomeFirstResponder method not get calledUITabBarController canBecomeFirstResponder 方法未被调用
【发布时间】:2015-09-04 20:07:26
【问题描述】:

阅读http://nshipster.com/uikeycommand/ 后,我想在我的应用程序中使用箭头键在选项卡之间添加导航。但我不能设法在 UITabBarController 中接收按键。下面的相同代码块适用于 UIViewController 但 UITabBarController。

当我尝试调试时,甚至不会调用 UITabBarController 的 canBecomeFirstResponder 覆盖。我在苹果的文档上没有找到有用的东西。欣赏任何使问题变得清晰的信息。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let firstResponderResult = self.becomeFirstResponder()
    println("became first responder \(firstResponderResult)")
}

override func canBecomeFirstResponder() -> Bool {
    return true
}

override var keyCommands: [AnyObject]? {
    return [
        UIKeyCommand(input: UIKeyInputRightArrow, modifierFlags: UIKeyModifierFlags.allZeros, action: "rightArrowClicked:"),
        UIKeyCommand(input: UIKeyInputLeftArrow, modifierFlags: UIKeyModifierFlags.allZeros, action: "leftArrowClicked:")
    ]
}

func rightArrowClicked(sender: UIKeyCommand) {

    let currentIndex = selectedIndex;

    if (currentIndex < viewControllers!.count - 1) {
        selectedIndex = currentIndex + 1;
    }
}

func leftArrowClicked(sender: UIKeyCommand) {
    let currentIndex = selectedIndex;

    if (currentIndex > 0) {
        selectedIndex = currentIndex - 1;
    }
}

【问题讨论】:

  • 这对你有用吗?在我的情况下,添加canBecomeFirstResponder 最初可以工作,但是在使用键盘移动到不同的 UIViewController(也具有相同的canBecomeFirstResponder 和 keyCommands)之后,第二个视图控制器不响应键盘输入。似乎它不会将 firstResponder 状态转移到第二个 VC。你的情况也是这样吗?
  • 不幸的是没用,我的情况和你一样。我认为,唯一可行的方法是下面的答案,但我也没有尝试过,只是放弃了实现这个功能。

标签: ios swift uitabbarcontroller uiresponder becomefirstresponder


【解决方案1】:

我认为你应该覆盖 UITabBarController 内 VC 的 canBecomeFirstResponder 方法,而不是标签栏控制器的。这样你应该可以得到按键。

【讨论】:

    【解决方案2】:

    Swift5 中的 iOS13 和 Mac Catalyst:

    extension UITabBarController {
    
        open override var keyCommands: [UIKeyCommand]? {
            return [
                UIKeyCommand(input: UIKeyCommand.inputRightArrow, modifierFlags: .alternate, action: #selector(rightArrowClicked)),
                UIKeyCommand(input: UIKeyCommand.inputLeftArrow, modifierFlags: .alternate, action: #selector(leftArrowClicked))
            ]
        }
    
        @objc private func rightArrowClicked(sender: UIKeyCommand) {
    
            let currentIndex = selectedIndex;
    
            if (currentIndex < viewControllers!.count - 1) {
                selectedIndex = currentIndex + 1;
            }
        }
    
        @objc private func leftArrowClicked(sender: UIKeyCommand) {
            let currentIndex = selectedIndex;
    
            if (currentIndex > 0) {
                selectedIndex = currentIndex - 1;
            }
        }
    
        open override var canBecomeFirstResponder: Bool {
            return true
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2014-03-04
      • 2020-02-25
      • 2012-10-16
      • 2021-08-12
      • 2012-01-28
      • 1970-01-01
      相关资源
      最近更新 更多