searchBar过滤了tableViewCells didSelectItemAt indexPath显示在navigationBar标题中

时间:2017-05-19 21:48:32

标签: swift uitableview uinavigationbar filtering uisearchbar

enter image description here enter image description here我无法从searchBar过滤的tableView单元格中实现didSelectRowAtIndexPath。当我基于searchbar textDidChange更新tableView列表,并执行show segue到另一个ViewController时,navigationBar Title总是显示未过滤的tableViews indexPath 0.换句话说,我想让导航标题显示来自搜索结果tableView的didSelectAtIndex(不是来自未过滤的tableView的原始indexPath单元格文本)。希望这是有道理的,并提前感谢!

// viewDidLoad method
    override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.searchBarStyle = UISearchBarStyle.prominent
        searchBar.placeholder = " Search Places..."
        searchBar.sizeToFit()
        searchBar.isTranslucent = false
        searchBar.backgroundImage = UIImage()
        searchBar.delegate = self
        searchBar.returnKeyType = UIReturnKeyType.done
        navigationItem.titleView = searchBar

        ref = FIRDatabase.database().reference()
        fetchPlaces()

        placesClient = GMSPlacesClient.shared()
        locationManager.requestAlwaysAuthorization()

        tableView.allowsMultipleSelectionDuringEditing = true

    }

    var placeList = [Place]()
    var placesDictionary = [String: Place]()

    // fetch places for tableView method
    func fetchPlaces() {
        let uid = FIRAuth.auth()?.currentUser?.uid
        let ref = FIRDatabase.database().reference().child("users").child(uid!).child("Places")
        ref.observe(.childAdded, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String: AnyObject] {
                let place = Place()
                place.setValuesForKeys(dictionary)

                if let addedBy = place.addedBy {
                    self.placesDictionary[addedBy] = place
                    self.placeList.insert(place, at: 0)
                }
                //this will crash because of background thread, so lets call this on dispatch_async main thread
                DispatchQueue.main.async(execute: {
                    self.tableView.reloadData()
                })
            }  
        }, withCancel: nil)
    }

    // search variables
        lazy var searchBar:UISearchBar = UISearchBar()
        var isSearching = false
        var filteredData = [Place]()

    // searchBar method
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            if searchBar.text == nil || searchBar.text == "" {
                isSearching = false
                view.endEditing(true)
                tableView.reloadData()
            } else {
                isSearching = true
                filteredData = placeList.filter({$0.place?.range(of: searchBar.text!) != nil})
                tableView.reloadData()
            }
        }

    // tableView methods
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            if isSearching {
                return filteredData.count
            }
            return placeList.count
        }

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = UITableViewCell(style: .subtitle, reuseIdentifier: cellId)
            if isSearching {
                cell.textLabel?.text = filteredData[indexPath.row].place
            } else {
            cell.textLabel?.text = placeList[indexPath.row].place
            }
            return cell
        }

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let placeDetailsVC = CurrentUserPlaceDetailsVC()
    if isSearching == false {
    placeDetailsVC.navigationTitle = placeList[(indexPath.row)].place
    show(placeDetailsVC, sender: self)
    } else {
        placeDetailsVC.navigationTitle = filteredData[(indexPath.row)].place
        show(placeDetailsVC, sender: self)
        }
    }
} 

1 个答案:

答案 0 :(得分:0)

在即将到来的ViewController中创建一个字符串。

class CurrentUserPlaceDetailsVC: UIViewController {
    var navigationTitle: String?

    override func viewDidLoad(){
        super.viewDidLoad()
        self.navigationItem.title = navigationTitle
    }
}

现在不是直接将标题分配给navigationBar,而是先将它分配给该字符串,然后再分配给viewController的viewDidLoad方法中的navigationBar。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let placeDetailsVC = CurrentUserPlaceDetailsVC()
        // Get Cell Label
        placeDetailsVC.navigationTitle = placeList[indexPath.row].place
        show(placeDetailsVC, sender: self)

    }