UITabBarController canBecomeFirstResponder方法不被调用

时间:2015-09-04 20:07:26

标签: ios swift uitabbarcontroller uiresponder becomefirstresponder

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

当我尝试调试时,对于UITabBarController的canBecomeFirstResponder覆盖甚至不会被调用。我没有在apple的文档中找到有用的东西。感谢任何使问题清晰的信息。

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;
    }
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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
    }