2016-08-04 2 views
0

В настоящее время я пытаюсь реализовать функцию поиска по UITableView с динамическими данными, полученными из вызова API.Быстродействующий поисковый контроллер

поток будет что-то вроде этого

  1. Нажмите правой бар кнопки элемент (функция поиска)
  2. Контроллер поиска представлен по табличном.
  3. Пользователь вводит текст и нажимает кнопку поиска
  4. Контроллер выполняет вызов API на основе поиска пользователя.
  5. Вид таблицы заполняется результатами.

Я видел примеры sokme о том, как реализовать поиск по таблицеView, и, по-моему, у меня разные, потому что я вручную представляю контроллер поиска. Он не отображается до нажатия кнопки поиска (в качестве примера для примеров, когда UISearch добавляется в представление заголовка таблицы, а функция поиска запускается, когда пользователь нажимает на панель поиска.)

Так что, в основном у меня есть некоторые вопросы:
1.- Подходит ли мой подход к iOS? Может быть, я не могу найти ресурсы о том, как я пытаюсь достичь, потому что это не так.
2.- Если true, как я могу отклонить контроллер поиска после нажатия кнопки поиска на клавиатуре?
3.- Как я могу отличить увольнение от кнопки поиска на клавиатуре или кнопкой отмены на панели поиска?

Вот мой код до сих пор:

extension MyTableViewController: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
    } 
} 

class MyTableViewController: UITableViewController, UISearchControllerDelegate { 
    var searchController: UISearchController! 
    var data = [CoolData]() 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "search"), style: .Plain, target: self, action: .SearchTapped) 
    } 

    func searchButtonTapped(sender: UIBarButtonItem) { 
    searchController = UISearchController(searchResultsController: nil) 
    definesPresentationContext = true 
    searchController.searchResultsUpdater = self 
    searchController.delegate = self 
    searchController.searchBar.translucent = false 
    searchController.searchBar.barTintColor = UIColor(hexString: BACConstants.color.Yellow) 
    searchController.searchBar.tintColor = UIColor(hexString: BACConstants.color.Black) 
    self.presentViewController(searchController, animated: true, completion: nil) 
    } 

} 

private extension Selector { 
    static let SearchTapped = #selector(InvolvedProcessesViewController.searchButtonTapped(_:)) 
} 
+0

На самом деле вы можете обратиться к коду, предоставленному Apple, для этого. Запустите образец кода, и он находится в разделе Поиск -> Настоящая панель навигации. Вот ссылка: https://developer.apple.com/library/prerelease/content/samplecode/UICatalog/Introduction/Intro.html – muazhud

+0

Я читал быстрый пример по этой ссылке: https://developer.apple.com /library/prerelease/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_SearchPresentOverNavigationBarViewController_swift.html#//apple_ref/doc/uid/DTS40007710-Swift_UIKitCatalog_SearchPresentOverNavigationBarViewController_swift-DontLinkElementID_77 кажется, объяснить, как представить строку поиска, но не так, как обрабатывать свои события , Но, по крайней мере, сейчас я знаю, что это iOS-friendly, так как это на официальных примерах. :) – lerp90

ответ

1

если вы используете UITableViewController, вы можете добавить UISearchController так:

var shouldShowSearchResults = false 
var searchController: UISearchController! 

func configureSearchController() { 
    searchController = UISearchController(searchResultsController: nil) 
    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    searchController.searchBar.delegate = self 
    searchController.searchBar.sizeToFit() 

    tableView.tableHeaderView = searchController.searchBar 
} 

затем осуществить это два делегата: UISearchResultsUpdating, UISearchBarDelegate

// MARK: - UISearchBarDelegate 

func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
    // do your thing 
} 

func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    // do your thing 
} 

func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
    // do your thing 
    searchController.searchBar.resignFirstResponder() 
} 

// MARK: - UISearchResultsUpdating 

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    let searchString = searchController.searchBar.text!.lowercaseString 

    // do your thing.. 

    tableView.reloadData() 
} 
+0

Спасибо за ответ, но это предполагает, что я хочу отобразить панель поиска над таблицей и запустить там функцию поиска.В моем случае поиск инициируется нажатием UIBarButtonItem над навигационным контроллером, который поддерживает табличное представление. – lerp90

+1

Ну, взяв ваш ответ, я, наконец, смог это сделать, мне просто пришлось немного подправить его, чтобы адаптировать его к моему делу. Большое спасибо! – lerp90

1

Tak ing @ matias-elorriaga Ответ Я, наконец, сделал это. Я использовал неверный делегат для обработки событий поиска.

extension MyTableViewController: UISearchResultsUpdating { 
    func updateSearchResultsForSearchController(searchController: UISearchController) { 
    } 
} 

class MyTableViewController: UITableViewController, UISearchBarDelegate { 
    var searchController: UISearchController! 
    var data = [CoolData]() 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "search"), style: .Plain, target: self, action: .SearchTapped) 
    } 

    func searchButtonTapped(sender: UIBarButtonItem) { 
    searchController = UISearchController(searchResultsController: nil) 
    definesPresentationContext = true 
    searchController.searchResultsUpdater = self 
    searchController.delegate = self 
    searchController.searchBar.translucent = false 
    searchController.searchBar.barTintColor = UIColor(hexString: BACConstants.color.Yellow) 
    searchController.searchBar.tintColor = UIColor(hexString: BACConstants.color.Black) 
    self.presentViewController(searchController, animated: true, completion: nil) 
    }  

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
    // Do stuff 
    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    // Do stuff 
    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
    self.searchController.dismissViewControllerAnimated(true, completion: nil) // When search is tapped, dismiss the search and fetch the results based on the filter 
    } 
} 

private extension Selector { 
    static let SearchTapped = #selector(InvolvedProcessesViewController.searchButtonTapped(_:)) 
} 
Смежные вопросы