单击搜索栏时如何导航到另一个视图控制器

Posted

技术标签:

【中文标题】单击搜索栏时如何导航到另一个视图控制器【英文标题】:How to navigate to another view controller when search bar is clicked 【发布时间】:2019-05-15 21:59:33 【问题描述】:

我有点卡在这里。我在导航栏中嵌入了一个搜索栏作为我想要的标题。

但是接下来我想导航到另一个视图控制器,其中包含集合视图中的 UIsearchcontroller,当点击取消时,用户将返回到前一个视图。 (非常类似于 Facebook 或 Instagram 对搜索栏控制器的使用)

我是否可以将搜索栏用作按钮来导航到处理所有搜索功能的下一个视图控制器?

这是我目前的搜索栏。

    func setUpNavBar() 
       let searchBar = UISearchBar()
       searchBar.sizeToFit()
       searchBar.searchBarStyle = .minimal
       searchBar.placeholder = "Search by username"
       searchBar.tintColor = UIColor.lightGray
       searchBar.barTintColor = UIColor.lightGray
       navigationItem.titleView = searchBar
       searchBar.isTranslucent = true
       

编辑

只是添加到下面的答案中,如果有人遇到此问题并且您希望获得将搜索栏视为按钮使用的效果

  func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool 
        self.present(UINavigationController(rootViewController: SearchBarController()), animated: true, completion: nil)
        searchBar.setShowsCancelButton(false, animated: true)
        return false
    

这样,当您单击搜索栏时,您不会获得显示搜索栏处于活动状态的效果(如果有意义的话)。当您点击搜索栏时,没有任何效果,它只是将您带到(真正的)搜索视图控制器,然后搜索栏处于活动状态,并且键盘显示带有取消按钮。我希望这是有道理的,如果有人想要一个示例,请前往 Instagram、FB 或 Pinterest,然后点击他们的搜索栏或搜索图标,您就会看到。

【问题讨论】:

【参考方案1】:

在第一个视图控制器中添加UISearchBarDelegate。并在searchBarTextDidBeginEditing 方法中呈现第二个视图控制器。

//ViewController.swift
class ViewController: UIViewController, UISearchBarDelegate 
    override func viewDidLoad() 
        super.viewDidLoad()
        setUpNavBar()
    
    func setUpNavBar() 
        let searchBar = UISearchBar()
        searchBar.delegate = self
        searchBar.sizeToFit()
        searchBar.searchBarStyle = .minimal
        searchBar.placeholder = "Search by username"
        searchBar.tintColor = UIColor.lightGray
        searchBar.barTintColor = UIColor.lightGray
        navigationItem.titleView = searchBar
        searchBar.isTranslucent = true
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) 
        self.present(UINavigationController(rootViewController: SearchViewController()), animated: false, completion: nil)
    

//SearchViewController.swift
class SearchViewController: UIViewController 
    let searchBar = UISearchBar()
    override func viewDidLoad() 
        super.viewDidLoad()
        view.backgroundColor = .white
        setUpNavBar()
    
    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        searchBar.becomeFirstResponder()
    
    func setUpNavBar() 
        searchBar.sizeToFit()
        searchBar.searchBarStyle = .minimal
        searchBar.placeholder = "Search by "
        searchBar.tintColor = UIColor.lightGray
        searchBar.barTintColor = UIColor.lightGray
        navigationItem.titleView = searchBar
        searchBar.isTranslucent = true
    

【讨论】:

感谢工作。无论如何我可以用 searchController 打开 SearchViewController 吗?所以它用键盘打开,取消按钮准备好了吗?如果单击取消,它会将用户带回到以前的 VC? @Clint 是的。你可以使用 searchController。在searchBarCancelButtonClicked委托方法调用self.dismiss方法 @Clint 并使用自定义委托将选定的值传递给 tableViewDidSelect 方法中的前一个视图控制器 我选择在搜索结果中使用集合视图而不是 tableView。你说使用自定义委托是什么意思? @Clint 使用collectionView:didSelectItemAtIndexPath:

以上是关于单击搜索栏时如何导航到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击按钮时从一个视图控制器导航到另一个视图控制器?

如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图

如何导航到另一个导航控制器iOS

iOS:在导航栏中显示搜索栏时隐藏范围栏

隐藏导航栏时如何启用滑动手势?

UIBarButtonItem插入导航栏时如何改变边框?