2016-07-21 3 views
3

У меня есть текстовое поле, которое представляет собой табличное представление как его входное представление. Я хочу добавить 2 вещи в эту таблицу.Добавление панели поиска программно в tableview в swift

1) добавить строку поиска.
2) добавить кнопку отмены в верхней части таблицы.

class enterYourDealVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate, UISearchResultsUpdating { 
var tableView: UITableView = UITableView() 
let searchController = UISearchController(searchResultsController: nil) 

var dealAirports = [ 
    airPorts(name: "Airport1", shortcut: "AP1")!), 
    airPorts(name: "Airport2", shortcut: "AP2")!) 
] 
var filteredAirports = [airPorts]() 


//view did load 
    tableView = UITableView(frame: UIScreen.mainScreen().bounds, style: UITableViewStyle.Plain) 
    tableView.delegate  = self 
    tableView.dataSource = self 
    tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 

    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    definesPresentationContext = true 
    tableView.tableHeaderView = searchController.searchBar 
    toTextField.inputView = self.tableView 

//here is my search function 
func filterContentForSearchText(searchText: String, scope: String = "All") { 
    filteredAirports = dealAirports.filter { ap in 
     return ap.name.lowercaseString.containsString(searchText.lowercaseString) 
    } 

    tableView.reloadData() 
} 
} 

Проблема с этим кодом, он не выполняет поиск. Также, когда я нажимаю на панель поиска, это отклоняет представление таблицы и возвращает меня обратно в viewcontroller. Как я могу это исправить?

и как я могу добавить кнопку отмены в эту таблицу?

+0

UISearchController Пример кода Apple: [Пример кода Apple] (https://developer.apple.com/libr ary/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html) Это поможет вам реализовать. – Chandan

+0

Это могло бы помочь мне, если бы я знал объективный c .. Это выглядит очень сложно для меня. Я буду продолжать изучать код. –

ответ

1

Вот код snipet в swift для того же. Для получения более справедливой ссылки Apple Doc упоминается в комментарии.

UISearchDisplayController осуждается в IOS8.0, и рекомендуется использовать UISearchController

Надеется, что это поможет вам много

ContactTVC

class ContactTVC:UITableViewController{ 
// MARK: Types 
/// State restoration values. 
enum RestorationKeys : String { 
    case viewControllerTitle 
    case searchControllerIsActive 
    case searchBarText 
    case searchBarIsFirstResponder 
} 

struct SearchControllerRestorableState { 
    var wasActive = false 
    var wasFirstResponder = false 
} 


/* 
The following 2 properties are set in viewDidLoad(), 
They an implicitly unwrapped optional because they are used in many other places throughout this view controller 
*/ 

/// Search controller to help us with filtering. 
var searchController: UISearchController! 

/// Secondary search results table view. 
var resultsTableController: ResultsTableController! 

/// Restoration state for UISearchController 
var restoredState = SearchControllerRestorableState() 
var arrayContacts: Array<CNContact> = [] 
var searchResultArrayContacts: Array<CNContact> = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    resultsTableController = ResultsTableController() 
// We want to be the delegate for our filtered table so didSelectRowAtIndexPath(_:) is called for both tables. 
    resultsTableController.tableView.delegate = self 

    searchController = UISearchController(searchResultsController: resultsTableController) 

    searchController.searchResultsUpdater = self 
    searchController.searchBar.sizeToFit() 
    tableView.tableHeaderView = searchController.searchBar 

    searchController.delegate = self 
    searchController.dimsBackgroundDuringPresentation = false // default is YES 
    searchController.searchBar.delegate = self // so we can monitor text changes + others 

    /* 
    Search is now just presenting a view controller. As such, normal view controller 
    presentation semantics apply. Namely that presentation will walk up the view controller 
    hierarchy until it finds the root view controller or one that defines a presentation context. 
    */ 

    definesPresentationContext = true 

} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // Restore the searchController's active state. 
    if restoredState.wasActive { 
     searchController.active = restoredState.wasActive 
     restoredState.wasActive = false 

     if restoredState.wasFirstResponder { 
      searchController.searchBar.becomeFirstResponder() 
      restoredState.wasFirstResponder = false 
     } 
    } 
} 

//MARK override TableViewDelegates/Datasource methods 
} 
extension ContactTVC: UISearchResultsUpdating{ 

// MARK: UISearchResultsUpdating 

func updateSearchResultsForSearchController(searchController: UISearchController) { 

     if let text = searchController.searchBar.text where (text.isEmpty == false){ 
     { 

          // Hand over the filtered results to our search results table. 

          let resultsController = searchController.searchResultsController as! ResultsTableController 

          resultsController.filteredProducts = Array(searchResult) 

          resultsController.tableView.reloadData() 

         dispatch_async(dispatch_get_main_queue(), { 
          self.tableViewContacts.reloadData() 
         }) 

       } 
     } 
} 
} 
//MARK: SearchBarDelegate 
extension ContactTVC: UISearchBarDelegate{ 

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 

    if let text = searchBar.text where (text.isEmpty == false) { 

      // update the search result array by filtering…. 


       if searchResult.count > 0{ 

        self.searchResultArrayContacts = Array(searchResult) 
       } 
       else{ 

        self.searchResultArrayContacts = Array(self.arrayContacts) 
       } 

       dispatch_async(dispatch_get_main_queue(), { 
        self.tableViewContacts.reloadData() 
       }) 
    } 
} 


func searchBarCancelButtonClicked(searchBar: UISearchBar) { 

    searchBar.text = nil 
    searchBar.resignFirstResponder() 

} 
} 

/// Табличного контроллер, ответственный за отображение фильтрованных продуктов по типу пользователя в поле поиска.

class ResultsTableController: UITableViewController { 
// MARK: Properties 

let reusableIdentifier = "contactCell" 

var filteredProducts = [CNContact]() 

override func viewDidLoad() { 

    self.tableView.emptyDataSetSource = self 
    self.tableView.emptyDataSetDelegate = self 

} 


// MARK: UITableViewDataSource 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return filteredProducts.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: reusableIdentifier) 

    var contact = CNContact() 
    contact = filteredProducts[indexPath.row] 

    // Configure the cell... 
    cell.textLabel?.text = contact.givenName 

    let phones = contact.phoneNumbers[0].value as! CNPhoneNumber 

    cell.detailTextLabel?.text = phones.stringValue 

    return cell 
} 
} 

Благодаря

4

Это добавит SeachBar

lazy var searchBar:UISearchBar = UISearchBar() 

override func viewDidLoad() 
{ 
    searchBar.searchBarStyle = UISearchBarStyle.Prominent 
    searchBar.placeholder = " Search..." 
    searchBar.sizeToFit() 
    searchBar.translucent = false 
    searchBar.backgroundImage = UIImage() 
    searchBar.delegate = self 
    navigationItem.titleView = searchBar 

} 

func searchBar(searchBar: UISearchBar, textDidChange textSearched: String) 
{ 
    ...your code... 
} 
1

// первый делегат записи для поиска "UISearchBarDelegate" // MARK: - Поиск действие кнопки

@IBAction func searchWithAddress(_ sender: Any) { 
let searchController = UISearchController(searchResultsController: nil) 
searchController.searchBar.delegate = self 
self.present(searchController, animated: true, completion: nil) 
} 
Смежные вопросы