我有这个数据结构在我的iOS项目有一个tableView从sqlite3数据库填充。
struct Song {
let id: Int
let songTitle: String
let movieName: String
let songSinger: String
let musicDirector: String
let songLyrics: String
let movieReleased: String
let songScale: String
let leadCast: String
let songTrivia: String
let scaleURL: String
let youtubeURL: String
let lyricsURL: String
}
这就是我如何创建我的sectionIndexTitlesArray:
var movieSet = Set<String>()
for song in songList {
movieSet.insert(song.movieName)
let firstLetter = String(song.movieName.prefix(1))
if !firstLetters.contains(firstLetter) {
firstLetters.append(firstLetter)
}
uniqueMovies = Array(movieSet)
uniqueMovies.sort()
sectionIndexTitles = firstLetters.sorted()
}
这是我如何创建数节:
func numberOfSections(in tableView: UITableView) -> Int {
if isSearching == true {
return 1
} else {
return uniqueMovies.count
}
}
这是关于section
的行数的函数if isSearching == true {
return filteredSongs.count
} else {
let sectionTitle = uniqueMovies[section]
let sectionData = songList.filter { $0.movieName == sectionTitle }
return sectionData.count
}
这是titleForHeaderSection
的函数func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if isSearching == true {
return nil
} else {
return " "+uniqueMovies[section]
}
}
这是sectionIndexTitles
的函数func sectionIndexTitles(for tableView: UITableView) -> [String]? {
if isSearching == true {
return nil
} else {
return sectionIndexTitles
}
}
是sectionForSectionIndexTitles的函数
func sectionForSectionIndexTitle(title: String, atIndex index: Int) -> Int {
return sectionIndexTitles.firstIndex(of: title)!
}
问题是,当我点击右边索引标题的字母时,它不会跳转到相应的部分。相反,它跳转到与sectionTitles的索引匹配的section。例如,如果我点击"D",它跳转到第4 sectionHeader。怎么了?
问题是可以有多个以相同字母开头的部分。所以你可能在uniqueMovies
中有5个值都以字母"A"开头,7个值以字母"B"开头,3个值以字母"C"等等。
如果用户轻按字母A,您希望进入第0部分。对于字母B,你要去第5部分。对于字母C,你要去第12部分。对于字母D,你要去第15部分,等等。
所以你的sectionForSectionIndexTitle
的实现不能简单地找到sectionIndexTitles
中字母的索引。您需要找到uniqueMovies
中以字母开头的第一个索引。
func sectionForSectionIndexTitle(title: String, atIndex index: Int) -> Int {
return uniqueMovies.firstIndex { $0.hasPrefix(title) } ?? 0
}