UITabBarController canBecomeFirstResponder 方法未被调用

Posted

技术标签:

【中文标题】UITabBarController canBecomeFirstResponder 方法未被调用【英文标题】:UITabBarController canBecomeFirstResponder method not get called 【发布时间】: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。你的情况也是这样吗? 不幸的是没用,我的情况和你一样。我认为,唯一可行的方法是下面的答案,但我也没有尝试过,只是放弃了实现这个功能。 【参考方案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
    

【讨论】:

以上是关于UITabBarController canBecomeFirstResponder 方法未被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使屏幕仅垂直。 (UITabBarController/Swift)

UITabBarController简单介绍

UITabBarController

UITabBarController 上的 WYPopoverController 下降

iOS开发UI篇—UITabBarController简单介绍

UITabBarController的基本原理及使用