user7556668
user7556668

Reputation:

Issue when filtering with UISearchResults

So I have a list of friends coming from the API and I've tried to implement also the search functionality. So far, so good, the filtering is good, but my first section is actually a button that sends me to another VC and it 's getting irritating that that cell always appears when I try to search through the friend list. Actually, i want it to be hidden when I search for friends.

I added some pictures to make it more clear this is how first the VC shows enter image description here enter image description here

As can be seen the third picture shows clearly the problem.

My code looks like.

var friendList = [Conversations]()
var filteredFriends = [Conversations]()

 func numberOfSections(in tableView: UITableView) -> Int {
    return friendList.count + 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isFiltering() {
        return filteredFriends.count
    }
    if section == 0 {
        return 1
    } else if section == 1 {
        return friendList.count
    }
    return 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "NewGroupConversationCell") as! NewGroupConversationTableViewCell
        return cell
    } else if indexPath.section == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "NewConversationCell") as! NewConversationTableViewCell
        var friendList: Conversations

        if isFiltering() {
            friendList = filteredFriends[indexPath.row]

        } else {
            friendList = self.friendList[indexPath.row]
        }

        cell.populate(friendList)
        return cell
    }
    return UITableViewCell()
}

    func searchBarIsEmpty() -> Bool {
    // Returns true if the text is empty or nil
    return searchController.searchBar.text?.isEmpty ?? true
}

func filterContentForSearchText(_ searchText: String, scope: String = "All") {
    filteredFriends = friendList.filter({( friend : Conversations) -> Bool in
        return (friend.name?.lowercased().contains(searchText.lowercased()))!
    })

    mainTableView.reloadData()
}

func isFiltering() -> Bool {
    return searchController.isActive && !searchBarIsEmpty()
}

extension NewConversationViewController: UISearchResultsUpdating {
// MARK: - UISearchResultsUpdating Delegate
func updateSearchResults(for searchController: UISearchController) {
    filterContentForSearchText(searchController.searchBar.text!)
}

Pls tell me if you need more explanation.

Upvotes: 0

Views: 82

Answers (2)

zheck
zheck

Reputation: 298

Your the numberOfSection is equal to number of friends, that's why you have the number of action button equals to number of friends, try

func numberOfSections(in tableView: UITableView) -> Int {
    return 2 // your button, and your friend list
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        if isFiltering() {
            return 0 // hide button
        }
        return 1
    } else if section == 1 {
        if isFiltering() {
            return filteredFriends.count
        }
        return friendList.count
    }
    return 0
}

Upvotes: 1

Sid Mhatre
Sid Mhatre

Reputation: 3417

Hide section 0 when you are using filtered list.

func numberOfSections(in tableView: UITableView) -> Int {
    return 2 // Default 2 sections
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        if isFiltering() {
            return 0
        }
        return 1
    } else {
        return friendList.count
    }
    return 0
}

Upvotes: 0

Related Questions