Метод UITabBarController canBecomeFirstResponder не вызывается

Прочитав http://nshipster.com/uikeycommand/, я захотел добавить навигацию между вкладками с помощью клавиш со стрелками в свой приложение. Но мне не удалось получить нажатия клавиш в UITabBarController. Тот же блок кода ниже работает в UIViewController, но в UITabBarController.

Когда я пытался выполнить отладку, переопределение canBecomeFirstResponder для UITabBarController даже не вызывалось. Я не нашел ничего полезного в документах 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;
    }
}

person mehmet6parmak    schedule 04.09.2015    source источник
comment
Это сработало для вас? В моем случае добавление canBecomeFirstResponder изначально работает, но после того, как клавиатура используется для перехода к другому UIViewController (который также имеет те же canBecomeFirstResponder и keyCommands), второй контроллер представления не отвечает на ввод с клавиатуры. Похоже, он не передает статус firstResponder второму ВК. Это верно и в вашем случае?   -  person Z S    schedule 11.11.2015
comment
К сожалению, не работает, у меня была такая же ситуация, как у вас. Я думаю, что единственный обходной путь, который будет работать, - это ответ ниже, но я тоже не пробовал, просто отказался от реализации этой функции.   -  person mehmet6parmak    schedule 11.11.2015


Ответы (2)


Я думаю, вы должны переопределить метод canBecomeFirstResponder VC внутри UITabBarController, а не контроллера панели вкладок. Таким образом, вы должны иметь возможность получать нажатия клавиш.

person CanC    schedule 07.09.2015

iOS13 и Mac Catalyst в Swift5:

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
    }
person iHTCboy    schedule 19.04.2020