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

Код для этого:

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if (indexPath.row == 0){
        self.performSegueWithIdentifier("First", sender: tableView)
    }

Когда пользователь завершает поиск по фильтрам, в этих ячейках появляется другой текст. Таким образом, то, что они нажимают, представляет собой неправильное представление. Это их способ сделать оператор my if выше, если строка равна определенному Sting в моем массиве.

Мой массив: var menu = ["first", "Second", "Third","Fourth", "Fifth", "Sixth"]

Когда пользователь не выполняет поиск, их ячейка и текст совпадают, но как только пользователь выполняет поиск, ячейки остаются там, где они совпадают с переходом, но текст, который имеет ячейка, отличается.

ОСНОВНАЯ ПРОБЛЕМА: текст ячеек не соответствует правильному виду, который должен быть представлен после поиска и фильтрации. Они просто расходятся независимо от текста в ячейке.

Если бы кто-нибудь мог предоставить мне новый код или скорректировать существующий, это было бы здорово. Задайте мне любые вопросы или если вам нужны разъяснения. Весь мой код находится в быстром темпе. Спасибо за помощь!

Новый код:

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

    filtered = menu.filter({ (text) -> Bool in
        let tmp: NSString = text
        let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
        return range.location != NSNotFound

        let menu = ["First", "Second", "Third","Fourth", "Fifth", "Sixth"]
        // when a search is done you check if your array contains the search result
        if menu.contains(searchBar.text!) {
            // you change the search to lowercase
            // so keep all your segue identifiers with lowercase strings
            let identifier = searchBar.text!.lowercaseString
            // perform the segue
            self.performSegueWithIdentifier(identifier, sender: tableView)




        }
0
MazzaMan 5 Янв 2016 в 03:34

2 ответа

Лучший ответ

Итак, у вас есть searchBar, и когда вы выполняете поиск, у вас будет ключевое слово из поиска, тогда вы можете сделать следующее:

// Your array
let menu = ["first", "Second", "Third","Fourth", "Fifth", "Sixth"]
// when a search is done you check if your array contains the search result
if menu.contains(searchBar.text) {
      // you change the search to lowercase
      // so keep all your segue identifiers with lowercase strings
      let identifier = searchBar.text.lowercaseString
      // perform the segue
      self.performSegueWithIdentifier(identifier, sender: tableView)
}

Обновить
Если вы хотите segue в строке, нажмите, сделайте следующее

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let identifier = menu[indexPath.row]
    self.performSegueWithIdentifier(identifier, sender: tableView)

Обновление 2

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
        let menu = ["first" , "Second", "Third","Fourth", "Fifth", "Sixth"]
        // when a search is done you check if your array contains the search result
        // if yes
        if menu.contains(searchText.text!) {
            // you change the saerchText to lowercase
            // so keep all your segue identifiers with lowercase strings
            let identifier = searchbar.text!.lowercaseString
            // perform the segue
            self.performSegueWithIdentifier("identifier", sender: tableView)
        }
    })

Окончательное решение, разрешившее вопрос OP

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)

    let menu = ["first", "second", "third","fourth", "fifth", "sixth"]
    // when a search is done you check if your array contains the search result

    let identifier = cell?.textLabel?.text!.lowercaseString

    if menu.contains(identifier!) {
        // you change the search to lowercase
        // so keep all your segue identifiers with lowercase strings
        // perform the segue
        self.performSegueWithIdentifier(identifier!, sender: tableView)  
    }
}
1
Rashwan L 5 Янв 2016 в 23:27

Когда пользователь выполняет поиск, сортируются ли результаты в новом массиве или данные сортируются в исходном массиве?

Если данные сортируются в другом массиве, вы можете просто добавить логический флаг, указывающий, когда в табличном представлении необходимо использовать отфильтрованный массив. Итак, в вашем

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:     
}

Ты мог бы иметь

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if (userHasSearch){
        //  Something with the filtered array of data
    } else {
        //  Something with the initial array
    }

Надеюсь, это поможет!

0
Charles-olivier Demers 5 Янв 2016 в 00:48