我正在更改我的 2 个数组...
var title = ["Title 1", "Title 2", "Title 3"]
var artist = ["Artist 1", "Artist 2", "Artist 3"]
...到一个结构
struct Song {
var title: String
var artist: String
}
var songs: [Song] = [
Song(title: "Title 1", artist "Artist 1"),
Song(title: "Title 2", artist "Artist 2"),
Song(title: "Title 3", artist "Artist 3"),
]
我设置了我的 UITableView
以便单元格的标题等于 songs[indexPath.row].title
,单元格的副标题等于 songs [indexPath.row].艺术家
。
但是,我希望能够使用 UISearchBar
搜索 UITableView
。每当我只有变量而不是结构时,它都能正常工作。但是,现在我在
var filteredTitles:[String] = []
var searchActive : Bool = false
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredTitles = title.filter //the error ({ (text) -> Bool in
let tmp: NSString = text as NSString
let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range.location != NSNotFound
})
if(filteredTitles.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.myTableView.reloadData()
}
如您所见,在 filteredTitles = title.filter
行中,它调用了我的旧变量 title
。我应该用什么替换这一行,以便它搜索结构的标题?
感谢您的帮助!
最佳答案
您需要将 filteredTitles
更改为 Song
数组(并将其重命名为 filteredSongs
。
然后更新对 filter
的调用,将 text
替换为 song
并访问 title
属性歌曲
。
并且无需将标题转换为 NSString
。
这是您的代码,需要进行一些更改:
var filteredSongs = [Song]()
var searchActive = false
func searchBar(searchText: String) {
filteredSongs = songs.filter { (song) -> Bool in
return song.title.range(of: searchText, options: [ .caseInsensitive ]) != nil
}
searchActive = !filteredSongs.isEmpty
self.myTableView.reloadData()
}
这假设 songs
是您的歌曲数组。
请注意,还有很多其他清理工作。
并且您可能需要更新您的 TableView 数据源方法来处理 filteredSongs
是 Song
数组而不是 String
数组>.
关于ios - 如何搜索结构(Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44875057/