在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?

Posted

技术标签:

【中文标题】在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?【英文标题】:How to dismiss keyboard in UISearchController when changing focus in tvos? 【发布时间】:2015-12-21 13:14:23 【问题描述】:

我对 tvos 完全陌生,我正在尝试实现一个 UISearchController 视图,其中在我的 SearchResultsViewController 中,我有两个 UICollectionViews 一个显示在另一个之上:

问题是当用户向下滑动以选择 UICollectionView 中的一项时,键盘不会关闭。即使向上滑动以选择键盘也不会完全向上滚动,并且无法看到您正在输入的内容。结果视图是这样的:

理想情况下,我希望在用户向下滑动以专注于界面中的其他任何内容时关闭键盘。我查看了 Apple 的 tvos UIKit Catalog,他们的示例显示了一个 UISearchController,它在更改焦点时会关闭键盘,但我没有看到他们在做任何不同的事情。

这是我在用户单击按钮时用来设置 UISearchController 的代码:

@IBAction func onSearchButton(sender: AnyObject) 
    guard let resultsController = storyboard?.instantiateViewControllerWithIdentifier(SearchResultsViewController.storyboardID) as? SearchResultsViewController else  fatalError("Unable to instantiate a SearchResultsViewController.") 

    // Create and configure a `UISearchController`.
    let searchController = UISearchController(searchResultsController: resultsController)
    searchController.searchResultsUpdater = resultsController
    searchController.hidesNavigationBarDuringPresentation = false

    let searchPlaceholderText = NSLocalizedString("Search for a Show or Movie", comment: "")
    searchController.searchBar.placeholder = searchPlaceholderText

    // Present the search controller from the root view controller.
    guard let rootViewController = view.window?.rootViewController else  fatalError("Unable to get root view controller.") 
    rootViewController.presentViewController(searchController, animated: true, completion: nil)

【问题讨论】:

【参考方案1】:

经过相当多的反复试验,我终于找到了解决方案。

只要满足以下条件,键盘就会自动关闭: 1) 用户关注的项目在滚动视图内 2) scrollview 内容大小比屏幕高度至少大 1px (1081px)。

【讨论】:

我正在努力解决这个问题,改变滚动视图的内容高度并没有为我解决这个问题。您是如何构建视图控制器的? @AaronStephenson 我也面临同样的问题。你找到解决问题的办法了吗?【参考方案2】:

经过相当多的尝试和错误,我终于想通了。 原因是您在 searchResultsController 中有嵌套的 ScrollViews

“ScrollViews”当然包括 UICollectionView、UITableView 和 UIScrollView。

根据我的调查,UISearchController 的行为如下。

    如果在 searchResultsController 中获得焦点的第一个视图是内部 scrollView 的子视图(在您的情况下是水平 UICollectionView),那么 您不会按预期隐藏键盘 .

    有趣的是,如果在 searchResultsController 中获得焦点的第一个视图是外部 scrollView 的子视图,那么您将完全隐藏键盘,动画效果,正如预期的那样 (!)。

我认为这是一种 UIKit 的错误。

【讨论】:

【参考方案3】:

我的布局完全相同,但目前无法实现。我相信您在 tableView(tableView: UITableView, canFocusRowAtIndexPath indexPath: NSIndexPath) -> Bool 中返回 false 以便集合视图中的每个单元格都可以以适当的焦点行为水平滚动。我认为这实际上是造成问题的原因。如果您使 tableview 中的第一个单元格成为焦点,问题就会消失,但当然不需要焦点行为。我今天才发现这一点,明天会尝试更多,看看我能做些什么。我感觉我需要一个新的设计,允许我使用单个 collectionview 或 tableview,它的单元格在 resultsController 中是可聚焦的。希望这在 tvOS 10 中很容易实现。

【讨论】:

【参考方案4】:

解决方案:在 indexPath.row == 0 处添加一个高度为 1 像素的虚拟单元格并启用焦点。

【讨论】:

以上是关于在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

UIButton 在焦点上将图像更改回原始图像(tvOS)

如何在 tvOS 中对按钮焦点执行动作事件

tvOS:如何处理 TabBar 和 UICollectionView 之间的焦点更改并防止崩溃

TVOS 10 SpriteKit 焦点导航默认焦点项目

SWIFT:在 TVOS 中退出收集时强制焦点引擎转到按钮