2017-02-18 64 views
1

一个UISearchBar或者是手动执行的搜索栏上的所有需要​​的观点的正确方法简单的方法? 我必须在我的应用程序的几乎每个视图中添加一个搜索栏(除了在每个视图导航栏上添加按钮)。但我不确定实现这一目标的最佳方法是什么。
如何添加在每个视图

  1. 我应该继承一个导航栏或整个导航控制器吗?
  2. 或者是以正确方式在所有需要的视图上手动实施搜索栏的简单方法?

如果我应该继承哪个类是正确的? 我的想法是子类UINavigationController,添加UISearchBar后搜索结果中取出,打开与搜索结果的UITableViewController

这是我目前的做法(不执行搜索栏委托只是为了检查,如果我是一个有效的解决方案)

import UIKit 

class MyNavigationControllerViewController: UINavigationController { 

    var searchController : UISearchController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.navigationBar.backgroundColor = UIColor.red 
     self.createSearchBar() 
    } 

    func createSearchBar() { 
     let searchBar = UISearchBar() 
     searchBar.showsCancelButton = true 
     searchBar.placeholder = "Search" 
     // searchBar.delegate = self 
     self.navigationItem.titleView = searchBar 
    } 
} 

至少,调试器进入MyNavigationController但无论是搜索栏是可见的,也不是红色导航栏。

+0

对不起,但由于剪贴板复制我的mac上的错误,同时编辑你的问题,我复制了句子。我指望编辑请求被拒绝,因此SO没有_edit cancel_功能。你能否正确地重构问题? – ystack

回答

1

我建议使用一协议与一个扩展将提供导航栏和项目的配置。然后,您可以扩展任何视图控制器以符合它并使用该协议的默认实现。

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     configureNavigationBar() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

extension ViewController: SearchController { } 

protocol SearchController: class { } 
extension SearchController where Self: UIViewController { 

    func configureNavigationBar() { 
     navigationController?.navigationBar.backgroundColor = UIColor.red 
     let search = UISearchBar() 
     search.placeholder = "Search" 
     search.showsCancelButton = true 
     navigationItem.titleView = search 
    } 
} 
相关问题