【问题标题】:UISearchController searchBar disappears on first clickUISearchController searchBar 在第一次点击时消失
【发布时间】:2016-01-25 07:13:47
【问题描述】:

我在 TableView 中实现了一个 UISearchController,由导航控制器推送。

首先我的问题是,每当我点击 SearchBar 时,它就会消失。当我输入一些文本时它可以工作,但它保持完全空白。然后我设法使用这段代码半解决了这个问题:

- (void)searchForText:(NSString*)searchText
{
    [self.view addSubview:villeSearchController.searchBar];
}

哪个半有效,因为现在,当我单击搜索栏时,它会空白,但是如果我输入一个字符,它会再次出现,然后无论如何它都会停留在那里。直到我取消搜索,然后再次单击它,在这种情况下它会空白。 我进行了一些测试,并且在第一次点击时调用了这个方法(searchForText),所以这不是原因。

有谁知道我如何解决这个问题并让搜索栏从第一次点击开始出现?

编辑:

这就是我初始化 SearchController 的方式:

villeSearchController = [[UISearchController alloc]   initWithSearchResultsController:nil];
villeSearchController.searchResultsUpdater = self;
villeSearchController.dimsBackgroundDuringPresentation = NO;
villeSearchController.searchBar.delegate = self;
villeTableView.tableHeaderView = villeSearchController.searchBar;
villeSearchController.searchBar.scopeButtonTitles = @[];
self.definesPresentationContext = YES;
[villeSearchController.searchBar sizeToFit];

【问题讨论】:

  • 嗨。请显示您的代码以初始化uisearchcontroller。检查此链接并确保您的初始化代码正确。 https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html
  • 您好,我已经更新了代码。我觉得很好
  • 1) 尝试检查NavigationBar 的半透明属性 - 当SearchController 将呈现searchBar 时,它应该是YES,否则将是UI 错误。 2) 如果UISearchController 使用默认演示文稿,则不应手动将searchBar 添加到子视图。
  • 你的第一个选项对我有用!请把它作为答案,我会接受的。第一个选项与第二个选项相结合!我不再添加子视图,只是放置半透明属性!

标签: ios tableview uisearchbar uisearchcontroller


【解决方案1】:

UISearchController 隐藏导航栏时,这发生在我身上。设置此属性修复它:

UISearchController.hidesNavigationBarDuringPresentation = NO;

【讨论】:

  • 谢谢伙计..拯救了我的一天..!!干杯
  • 这是正确答案。它甚至适用于 iOS 11。
【解决方案2】:

尝试检查navigationBar.translucent 属性 - 当UISearchController 将呈现searchBar 时,它应该是YES,否则将是UI 错误。

来自@SiavA 的更新

更好的解决方案是使用UIViewControllerextendedLayoutIncludesOpaqueBars 属性。如果您使用不透明导航栏,只需将其设置在控制器的true 中,控制器将显示UISearchController(不适用于navigationController)。

例如

- (void)viewDidLoad {
    [super viewDidLoad];

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController.navigationBar.translucent;
}

【讨论】:

  • 天哪,非常感谢!
  • 这不是 UI 错误。如果 navigationBar.transcluent 为 NO,那么您的导航栏是不透明的,您必须通知 UI 对应于 iOS 7 Using View Controllers(还请查看 edgesForExtendedLayout):developer.apple.com/library/ios/documentation/UserExperience/… 所以,要修复您的“错误”,您有将您的导航控制器的 extendedLayoutIncludesOpaqueBars 设置为 YES。
  • @SiavA。你好。一个很好的评论。我会将其添加到响应中。
【解决方案3】:

将 SearchController 放在 UIScrollView 中,它会正常工作。如果您在节标题中使用它或作为单独的视图使用它

【讨论】:

    【解决方案4】:

    如果您在 iOS11 中遇到这个问题(特别是如果它在 iOS11 之前工作),我必须更改我的 UISearchController 以附加到 navigationItem 而不是 tableView。

    在我的searchController上设置参数后,我曾经这样做:

    tableView.tableHeaderView = searchController.searchBar
    

    现在我有了这个:

    navigationItem.searchController = searchController
    

    “半透明”修复将允许控制器出现,但是当我尝试放松到特定的 segue 时,我会崩溃。将 searchController 附加到 navigationItem 修复了显示和崩溃问题。

    【讨论】:

      【解决方案5】:

      将导航栏的 isHidden 设置为 false 会阻止搜索栏对我消失。

            self.navigationController?.navigationBar.isHidden = false
      

      【讨论】:

        【解决方案6】:

        大家好,这个问题有一个非常简单的解决方案。 -- 这将解决视图集合和包含多个视图控制器的父视图的主要问题。

        • 如果您刚刚从代码中删除以下代码,则不需要任何以下代码

        // searchController.definesPresentationContext = true

        // self.definesPresentationContext = true

        // self.extendedLayoutIncludesOpaqueBars = !(self.navigationController?.navigationBar.isTranslucent)!

        我只是添加下面的代码确保你设置 searchController 总是设置 nil 如果您在 viewController 之间切换,可能会出现一些冲突,可以通过在 setupsearchbar() 中将其设置为 searchController nil 来清除。 另外,禁用 viewDidDissapear() 上的 searchController,它将解决与活动搜索栏移动到下一个屏幕相关的问题。

        var searchController = UISearchController(searchResultsController: nil)
        
        
        func setupSearchBar() {
        
         searchController = UISearchController(searchResultsController: nil)
        
        // adding search controller
        searchController.searchResultsUpdater = self
        
        // changing font color when user types
        searchController.searchBar.searchTextField.textColor = .black
        
        //allows select results from filtered table
        searchController.searchBar.endEditing(true)
        
        searchController.obscuresBackgroundDuringPresentation = false
        
        searchController.hidesNavigationBarDuringPresentation = false
         
        self.tableView.tableHeaderView = searchController.searchBar
         
            
        }
        
        override func viewDidDisappear(_ animated: Bool) {
            searchController.isActive = false
        
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-11
          • 1970-01-01
          • 2014-03-06
          • 2016-01-03
          • 1970-01-01
          • 2014-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多