谁能告诉我为啥我的过滤数组是空的?
Posted
技术标签:
【中文标题】谁能告诉我为啥我的过滤数组是空的?【英文标题】:Can anyone tell me why my filtered array is empty?谁能告诉我为什么我的过滤数组是空的? 【发布时间】:2017-07-07 16:34:09 【问题描述】:我添加了一个表格视图和一个搜索栏(以编程方式)。我想显示过滤后的结果,所以我创建了一个数组(称为:todoTitle),其中包含我的 todo 活动的标题(我有一个单独的对象,它的属性之一是标题)。我使用 updateSearchResults 方法,并在其中使用过滤器方法返回正确的待办事项。为了检查数组是否为空,我在该函数内部编写代码来打印每个数组内部的待办事项。这是我在 updateSearchResults(for:) 函数中的代码
//filtering through todos' titles
filteredTodos = self.todosTitle.filter( (title: String) -> Bool in
if title.lowercased().contains((self.searchController.searchBar.text?.lowercased())!)
return true
else
print ("S \(todosTitle)")
print ("t \(title)")
print (filteredTodos)
return false
)
//updating the results TableView
self.resultsController.tableView.reloadData()
``
todosTitle 数组不是空的,所以我不明白为什么我的 filtersTodos 是空的。有谁知道为什么会发生这种情况?
【问题讨论】:
打印结果数组filteredTodos
在闭包内没有多大意义。
你应该打印 self.searchController.searchBar.text 吗?安慰和检查。它会阻塞,这可能是原因。
filteredTodos
在过滤器返回之前不会被设置为过滤器的结果。只是为了清楚
为什么self.searchController.searchBar.text?.lowercased()
被()
包围?这是不必要的,使它看起来像一个元组。
@adev 当第二个表视图应该显示搜索结果时出现问题(错误:意外发现 nil)。这样做是因为它的行数和每个单元格的内容是基于为空的 filtersTodos 数组的内容。我试过打印 self.searchController.searchBar.text?在 else 子句中进行控制台并打印字母,直到我按下活动标题内的字母。在这种情况下,它会抛出一个关于 nil 的错误。
【参考方案1】:
您只需要检查待办事项标题是否包含搜索文本。这是一个简化的示例,我使用字符串数组和搜索文本字符串进行了测试。也许将您的搜索文本分配分开,以确保您从 searchBar.text 获得您期望的字符串
let todosTitle = ["One", "Two", "Three"]
let searchText = "t"
//filtering through todos' titles
let filteredTodos = todosTitle.filter( (title: String) -> Bool in
return title.lowercased().contains(searchText.lowercased())
)
print(filteredTodos) //["Two", "Three"]
【讨论】:
我也是这样做的,但是我没有使用一些文字字符串,而是使用了 searchBar 中的文本。我检查了一下,在上面的方法中,我的 todosTitle 数组不是空的,所以我添加一些值的代码的其他部分就可以了(我认为是这样)。问题是,我不明白为什么 filter 方法看不到我的 todosTitle 数组不是空的(同样,上面方法中的 print() 函数打印数组包含的所有对象)。 即使我从闭包中打印“title”属性,它也会打印 todosTitle 数组中的所有项目,因此它不为空。 闭包完成后才会分配过滤后的数组。以上是关于谁能告诉我为啥我的过滤数组是空的?的主要内容,如果未能解决你的问题,请参考以下文章
java问题:为啥这个list里面的实体类都是空的,但是实体类里面有值,dao层采用mybatis