Uitableview UISearchController在可访问的

Uitableview UISearchController在可访问的,uitableview,accessibility,uisearchcontroller,voiceover,Uitableview,Accessibility,Uisearchcontroller,Voiceover,我使用UISearchController和表视图实现了一个搜索屏幕。当我开始搜索某个内容时,搜索控制器会在表视图的顶部添加一个视图(尽管它什么也不做),直到我将searchController.active设置为false,表视图才可以通过VoiceOver访问。我已经尝试了几乎所有的方法,唯一的解决办法是放弃UISearchController,转而使用UISearchBar。当前,一旦显示键盘且搜索控制器处于活动状态,VoiceOver选择器将从文本字段转到一个条形按钮项,然后跳过表格视图

我使用UISearchController和表视图实现了一个搜索屏幕。当我开始搜索某个内容时,搜索控制器会在表视图的顶部添加一个视图(尽管它什么也不做),直到我将searchController.active设置为false,表视图才可以通过VoiceOver访问。我已经尝试了几乎所有的方法,唯一的解决办法是放弃UISearchController,转而使用UISearchBar。当前,一旦显示键盘且搜索控制器处于活动状态,VoiceOver选择器将从文本字段转到一个条形按钮项,然后跳过表格视图并转到键盘。这是我的UISearchController设置

searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.delegate = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.searchBarStyle = .Minimal
    searchController.searchBar.keyboardAppearance = .Dark
    searchController.searchBar.showsCancelButton = false
    searchController.searchBar.delegate = self
    searchController.searchBar.text = prefilledSearch
    searchController.view.layer.borderColor = UIColor.redColor().CGColor
    searchController.view.layer.borderWidth = 1.0
    searchController.view.isAccessibilityElement = false
    searchController.view.hidden = true
    searchController.searchBar.setShowsCancelButton(false, animated: false)

如何修复此问题并继续使用UISearchController?目前,我的应用程序中的VoiceOver用户无法使用搜索功能。

根据我在本页上的发现,问题是您将searchResultsController设置为nil,这会使原始视图控制器显示搜索结果。当搜索控制器具有焦点时,它会阻止VoiceOver访问原始视图控制器中的搜索结果。通过指定一个单独的结果视图控制器,VoiceOver将起作用。

这是因为底层的
UITransitionView
AccessibilityViewModalSelector
设置了不正确的值,该值会在搜索视图中捕获VO,在您的情况下,该视图为空

我只能通过在private
UITransitionView
上滑动
accessibilityViewIsModal
来修补此行为

我在一篇博客文章中描述了这项技术:

相关GIST:


我发现被接受的答案是次优的,尽管它在技术上可能是正确的

如果您在演示过程中使用
模糊背景
(在iOS 9.1中添加)并将其设置为
,VoiceOver可以访问基础表视图

用法:

searchController.obscuresBackgroundDuringPresentation = false

在Swift中,您可以执行
func didPresentSearchController(searchController:UISearchController){searchController.view.superview?.accessibilityViewIsModal=false}
@Maximilian发布此答案时,这对我不起作用。