Swift 3 - 推送新视图但保留相同的NavigationBar

时间:2017-08-22 22:03:18

标签: ios swift uisearchbar navigationcontroller

我的申请表中有UISearchBar。当我按下“打开”按钮时,搜索栏会出现一个新视图。但问题是NavigationController更改而UISearchBar消失。我该怎么办?即使出现了新视图,我也可以将当前NavigationController保留在我的搜索栏中。 (所以当新视图出现时我仍在搜索)

P.s我的代码不是最好的,我没有使用Storyboard!

class HomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UISearchBarDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView?.backgroundColor = UIColor.white

    setupNavigationBar() 
}

以下是新视图:

class UserSearchController: UICollectionViewController, UISearchBarDelegate {

override func viewDidLoad() {
    super.viewDidLoad()
    collectionView?.backgroundColor = UIColor.blue


    }

}

以下是整个搜索栏代码:

import UIKit

var searchBar = UISearchBar()
var searchBarButtonItem: UIBarButtonItem?
var logoImageView: UIImageView!

extension HomeController {

    func setupNavigationBar() {
        let button = UIButton(type: .system)
        button.setImage(#imageLiteral(resourceName: "search"), for: .normal)
        button.addTarget(self, action: #selector(showSearchBar), for: .touchUpInside)
        button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        let barButton = UIBarButtonItem(customView: button)
        self.navigationItem.rightBarButtonItem = barButton

        let logoImage = UIImage(named: "home")!
        logoImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: logoImage.size.width, height: logoImage.size.height))
        logoImageView.image = logoImage
        navigationItem.titleView = logoImageView


        searchBar.delegate = self
        searchBar.searchBarStyle = UISearchBarStyle.minimal
        searchBar.placeholder = "Search"
        searchBar.barTintColor = UIColor.gray
        searchBarButtonItem = navigationItem.rightBarButtonItem

    }


    func showSearchBar() {
        let layout = UICollectionViewFlowLayout()
        let userSearchController = UserSearchController(collectionViewLayout: layout)
        self.navigationController?.pushViewController(userSearchController, animated: true)
        searchBar.alpha = 0
        navigationItem.titleView = searchBar
        navigationItem.setLeftBarButton(nil, animated: true)
        navigationItem.rightBarButtonItem = nil
        searchBar.showsCancelButton = true
        UIView.animate(withDuration: 0.5, animations: {
            self.searchBar.alpha = 1
        }, completion: { finished in
            self.searchBar.becomeFirstResponder()
        })
    }


    public func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        hideSearchBar()

    }

    func hideSearchBar() {
        navigationItem.setRightBarButton(searchBarButtonItem, animated: true)
        logoImageView.alpha = 0
        UIView.animate(withDuration: 0.3, animations: {
            self.navigationItem.titleView = self.logoImageView
            self.logoImageView.alpha = 1
        }, completion: { finished in

        })
    }


}

2 个答案:

答案 0 :(得分:1)

您的搜索栏仅在第一个View Controller上可见的原因是您正在使用View Controller的titleView属性。每个UIViewController都有自己的titleView属性,因此如果将View Controller推送到第一个VC,它还需要将titleView属性设置为具有所需配置的搜索栏视图。

答案 1 :(得分:0)

我认为你可以创建一个基类,在基类上面添加UISearchBar,然后你希望当前带有UISearchBar的控制器继承你的基类