Получить textLabel из UITableView - PullRequest
1 голос
/ 07 июня 2019

Мне нужно получить textLabel из строки в UITableView.Но я получаю nil.Мне нужно получить textLabel, потому что я использую UISearchBar, если я попытаюсь получить данные с помощью индекса, при поиске я получу неправильные индексы.Итак, я хочу получить textLabel.Пожалуйста, исправьте, где я ошибаюсь

Когда я набираю searchBar, пункты в TableView меняются.Но индекс не делает.Например Food = ["Apple", "Banana", "Coca-Cola"].Если я использую searchBar и введите «Банан».Затем я нажимаю на это, но я получаю Apple (потому что это индекс - 0).Вот почему я хочу получить textLabel

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //let meal = foods[indexPath.item]
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let labelContent = cell.textLabel!.text
        print(labelContent)
    }

UISearchBar

extension FoodViewController: UISearchBarDelegate {

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    searchedFoods = foods.filter({ $0.title.lowercased().prefix(searchText.count) == searchText.lowercased() })
    searching = true
    tableView.reloadData()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    searching = false
    searchBar.text = ""
    tableView.reloadData()
  }

}

Ответы [ 6 ]

3 голосов
/ 07 июня 2019

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

И никогда использовать dequeueReusableCell за пределами cellForRowAt. Вы не получите ожидаемую клетку.

В этом случае вы должны получить данные в зависимости от searching

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let labelContent : String
    if searching { 
       labelContent = searchedFoods[indexPath.row].title
    } else {
       labelContent = foods[indexPath.row].title
    }
    print(labelContent)
}

А твой filter метод ужасен. Измените его на гораздо более эффективный

searchedFoods = foods.filter { $0.title.range(of: searchText, options: [.caseInsensitive, .anchored] != nil) }

Наконец, я рекомендую изменить textDidChange, чтобы отменить поиск также, если текст поиска становится пустым, и удалить неиспользуемые элементы из searchedFoods.

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        searchedFoods.removeAll()
        searching = false
    } else {
        searchedFoods = foods.filter{ $0.title.range(of: searchText, options: [.caseInsensitive, .anchored]) != nil }
        searching = true
    }
    tableView.reloadData()
}
1 голос
/ 07 июня 2019

Как я выяснил, проблема в том, что вы используете indexPath.item, поэтому вы получаете неправильный индекс, попробуйте это

let meal = foods[indexPath.row]
0 голосов
/ 07 июня 2019

Попробуйте

расширение FoodViewController: UITableViewDataSource {

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell = tableView.dequeueReusableCell (withIdentifier):", для: indexPath)

    if searching {
        let food = searchedFoods[indexPath.row]
        cell.textLabel?.text = food.title
    } else {
        let food = foods[indexPath.row]
        cell.textLabel?.text = food.title
    }
    return cell


}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searching {
        return searchedFoods.count
    } else {
        return foods.count
    }
}

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

при поиске {

         let meal = searchedFoods[indexPath.row]
    let labelContent = meal
    print(labelContent)
    } else {
         let meal = foods[indexPath.row]
    let labelContent = meal
    print(labelContent)
    }

}
0 голосов
/ 07 июня 2019

Пожалуйста, попробуйте вот так,

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if searching {
            print(searchedFoods[indexPath.row])
        } else {
            print(foods[indexPath.row])
        }
    }
0 голосов
/ 07 июня 2019

Допустим, вместо того, чтобы получать данные из продуктов (в методе didSelect), получайте их из поиска продуктов. Но для того, чтобы это работало должным образом, вы должны назначить искомую еду вместе с едой, а также, когда пользователь очистит строку поиска, вы должны снова сбросить искомую еду на данные еды.

0 голосов
/ 07 июня 2019

Если вы хотите получить текст с UILabel на кране cell

подтвердить UITableViewDelegate

//Access the array that you have used to fill the tableViewCell
    print(foods[indexPath.row]) it will print selected row 
OR

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath) as! UITableViewCell
        let labelContent = cell.textLabel!.text
        print(labelContent)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...