【问题标题】: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,然后点击他们的搜索栏或搜索图标,您就会看到。

【问题讨论】:

    标签: ios swift xcode search uisearchbar


    【解决方案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。你说使用自定义委托是什么意思?
    猜你喜欢
    • 2012-05-05
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多