我正在改变我的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].artist
。
但是,我希望能够使用UITableView
搜索UISearchBar
。每当我只有变量而不是结构时,它工作正常。但是,现在我发现错误
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
。我该怎么替换这一行,以便搜索结构的标题?
感谢您的帮助!
答案 0 :(得分:1)
您需要将filteredTitles
更改为Song
的数组(并将其重命名为filteredSongs
。
然后将通话更新为filter
,以便将text
替换为song
,并访问title
的{{1}}属性。
并且无需将标题转换为song
。
这是您的代码所需的更改:
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
数组filteredSongs
而不是Song
数组。