我需要从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()
}
}
答案 0 :(得分:3)
永远不要从单元格视图获取数据,总是从数据源模型获取数据。
并且从不在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 :(得分:1)
我发现问题在于您使用的是indexPath.item
,这就是为什么您获得错误的索引的原因,请尝试
let meal = foods[indexPath.row]
答案 2 :(得分:0)
如果您想在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)
}
答案 3 :(得分:0)
让我们说而不是从食物中获取数据(在didSelect方法中)是从搜索到的食物中获取数据。但是,要使其正常工作,您应该首先为食物分配食物,并且当用户清除搜索栏时,应再次将食物重新设置为食物数据。
答案 4 :(得分:0)
请尝试这样
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if searching {
print(searchedFoods[indexPath.row])
} else {
print(foods[indexPath.row])
}
}
答案 5 :(得分:0)
尝试一下
扩展名FoodViewController:UITableViewDataSource {
func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier:“ Cell”,for: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)
}
}