2016-10-21 2 views
1

У меня есть UITableView с панелью поиска в виде заголовка. Я использую эту функцию для обновления моих данных, когда пользователь выполняет поиск в строке поиска.Дважды нажмите, чтобы выбрать элемент TableView с помощью панели поиска

func updateSearchResults(for searchController: UISearchController) { 

    if let searchText = searchController.searchBar.text { 
     if (searchText.characters.count > 0) { 
      self.filteredResults = []; 
      self.locationManager?.geocodeAddressString(addressString: searchText, completionHandler: { (results, error) in 
       if error == nil && results != nil { 
        self.filteredResults = results!; 
        self.tableView.reloadData(); 
       } 
      }); 
     } 
     else { 
      self.filteredResults = []; 
      self.tableView.reloadData(); 
     } 
    } 
} 

и эта функция, когда я выбираю ячейку в своем UITableView.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    self.delegate?.setCity(city: str); 
    self.dismiss(animated: true, completion: nil); 
} 

Вот моя проблема: контроллер вида не отклоняется при первых нажатиях на ячейку. Я один раз ударяю, панель поиска уходит в отставку. И мне нужно дважды нажать, чтобы выполнить увольнение.

Вот как связать мой TableView и мой строку поиска в viewDidLoad:

// Search Bar componants 
self.searchController = UISearchController(searchResultsController: nil); 
self.searchController.delegate = self; 
self.searchController.searchResultsUpdater = self; 
self.searchController.hidesNavigationBarDuringPresentation = false 
self.searchController.dimsBackgroundDuringPresentation = false; 

self.searchBar = self.searchController.searchBar; 
self.searchBar.searchBarStyle = .default; 
self.searchBar.delegate = self; 
self.searchBar.placeholder = NSLocalizedString("search.city", comment: "search.city").capitalized; 

self.tableView = UITableView(frame: CGRect.zero, style: .plain); 
self.tableView.translatesAutoresizingMaskIntoConstraints = false; 
self.tableView.delegate = self; 
self.tableView.backgroundColor = UIColor.white; 
self.tableView.dataSource = self; 
self.tableView.tableHeaderView = self.searchBar; 
self.view.addSubview(self.tableView); 

Если кто-то может помочь мне, что было бы здорово :)

+0

Просто выстрел в темноте, если вы переключитесь заявления и смещать точку зрения первого, он работает, как ожидалось? – dstepan

+0

Нет. Я действительно выгляжу, как первые краны просто заканчивают редактирование строки поиска. –

+0

Если вы установите контрольную точку в 'didSelectRowAt', точка останова попадет в первый раз? – dstepan

ответ

0

Вы можете добавить кран жест распознаватель к вашему мнение, что при выстреле будет

  1. уволиться панелью поиска ответчика
  2. преобразовать расположение крана до точки в вас табличных
  3. получить ячейку, которая касается местоположения
  4. ручное вызов didSelectRowAt, который не является «лучшим» решением, но для демонстрационных целей.

Вот как это выглядит внедрено:

override func viewDidLoad() { 
     super.viewDidLoad() 

     // Add a tap gesture to our view 
     let gesture = UITapGestureRecognizer(target: self, action: #selector(TestTableViewController.didTap(_:))) 
     self.view.addGestureRecognizer(gesture) 
    } 

    // Called when the tap gesture fires 
    func didTap(gesture: UITapGestureRecognizer) { 

     // We get rid of our keyboard on screen 
     searchBar.resignFirstResponder() 

     // Find the location of the touch relative to the tableView 
     let touch = gesture.locationInView(self.tableView) 

     // Convert that touch point to an index path 
     if let indexPath = tableView.indexPathForRowAtPoint(touch) { 

      // Here I am just calling the delegate method directly which you shouldn't do. 
      // You should just do whatever you want to do with the indexPath here. 
      tableView(tableView, didSelectRowAtIndexPath: indexPath) 
     } 
    } 
Смежные вопросы