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 上的 WYPopoverController 下降