如何使用可变数据源在表视图中按字母顺序创建节标题

Mik*_*key 7 header tableview sections swift

我将视图控制器的字符串存储在字符串数组中.我在表视图中将此字符串数组导入为数据源.一切顺利.但现在我想对表视图进行排序并添加节标题.节标题应该来自字母表,意义节的行应该是数组中的所有字符串,从节标题的字母开始.

我知道如何使用静态数组实现这一目标.但是我怎么能只显示那些也有行(数组中的字符串)的部分呢?我怎样才能使它在保存带字母的新字符串时生成一个新的部分,这些部分中尚不存在?

我希望我已经足够准确地解释了它.我试了很久才解决这个问题.如果有人可以帮助我会很棒.

以下是一些代码段:

class OverViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var addButton: UIBarButtonItem!
@IBOutlet weak var editButton: UINavigationItem!


var kontaktListe = Telefonbuch.loadArray()
var sections = [[String]]()
var collation = UILocalizedIndexedCollation.currentCollation()


override func viewDidLoad()
{
    super.viewDidLoad()
    tableView.dataSource = self
    configureSectionData()
    tableView.reloadData()

}


func configureSectionData()
{
    let names = kontaktListe.map{$0.name}

    let selector: Selector = "description"


    sections = Array(count:collation.sectionTitles.count, repeatedValue: [])

    let sortedObjects = collation.sortedArrayFromArray(names, collationStringSelector: selector)

    for object in sortedObjects {
        let sectionNumber = collation.sectionForObject(object, collationStringSelector: selector)
        sections[sectionNumber].append(object as! String)
    }
}
Run Code Online (Sandbox Code Playgroud)

我加载对象var kontaktListe = Telefonbuch.loadArray()并获取name属性let names = kontaktListe.map{$0.name}.在那里,我想得到字符串来排序和添加.

小智 13

我会更改您将联系人存储到dictonary的方式,并将首字母作为键,并将与该首字母对应的名称放入子数组中:

contacts = ["A": ["Anton", "Anna"], "C": ["Caesar"]]
Run Code Online (Sandbox Code Playgroud)

我在这里简化了联系方式(以字符串的形式),但是你得到了概念.

我也会将字母的节号保存在一个单独的数组中,如下所示:

letters = ["A", "C"]
Run Code Online (Sandbox Code Playgroud)

保持数组排序和组织,因此请在每次插入/删除/更新后进行检查.这不是表视图实现的一部分.我会让Viewcontroller成为电话簿的代表,因此您可以从电话簿中激活类似更新的方法来更新表.

如何获取数据源的数据:

部分数量:

letters.count
Run Code Online (Sandbox Code Playgroud)

索引i部分的标题是

letters[i]
Run Code Online (Sandbox Code Playgroud)

部分i中的单元格数量

contacts[letters[i]].count
Run Code Online (Sandbox Code Playgroud)

并且第i部分中特定单元格c的内容是:

contacts[letters[i]][c]
Run Code Online (Sandbox Code Playgroud)

如果仍然不清楚,请随时提出进一步的问题.

更新 - 如何生成数组:

我不需要对数据进行排序,如果你已经排序了它,你可以删除下面的排序行......

let data = ["Anton", "Anna", "John", "Caesar"] // Example data, use your phonebook data here.

// Build letters array:

var letters: [Character]

letters = data.map { (name) -> Character in
    return name[name.startIndex]
}

letters = letters.sort()

letters = letters.reduce([], combine: { (list, name) -> [Character] in
    if !list.contains(name) {
        return list + [name]
    }
    return list
})


// Build contacts array:

var contacts = [Character: [String]]()

for entry in data {

    if contacts[entry[entry.startIndex]] == nil {
        contacts[entry[entry.startIndex]] = [String]()
    }

    contacts[entry[entry.startIndex]]!.append(entry)

}

for (letter, list) in contacts {
    list.sort()
}
Run Code Online (Sandbox Code Playgroud)

对于Swift 3:

let data = ["Anton", "Anna", "John", "Caesar"] // Example data, use your phonebook data here.

// Build letters array:

var letters: [Character]

letters = data.map { (name) -> Character in
    return name[name.startIndex]
}

letters = letters.sorted()

letters = letters.reduce([], { (list, name) -> [Character] in
    if !list.contains(name) {
        return list + [name]
    }
    return list
})


// Build contacts array:

var contacts = [Character: [String]]()

for entry in data {

    if contacts[entry[entry.startIndex]] == nil {
        contacts[entry[entry.startIndex]] = [String]()
    }

    contacts[entry[entry.startIndex]]!.append(entry)

}

for (letter, list) in contacts {
    contacts[letter] = list.sorted()
}
Run Code Online (Sandbox Code Playgroud)

我在操场上运行代码并获得以下输出

信件:

["A", "C", "J"]
Run Code Online (Sandbox Code Playgroud)

联系方式:

["J": ["John"], "C": ["Caesar"], "A": ["Anton", "Anna"]]
Run Code Online (Sandbox Code Playgroud)


Vla*_*iak 6

对于Swift 3。谢谢@Stefan!这是我的Set版本

var tableViewSource: [Character : [String]]!
var tableViewHeaders: [Character]!

let data = ["Anton", "Anna", "John", "Caesar"]

func createTableData(wordList: [String]) -> (firstSymbols: [Character], source: [Character : [String]]) {

    // Build Character Set
    var firstSymbols = Set<Character>()

    func getFirstSymbol(word: String) -> Character {
        return word[word.startIndex]
    }

    wordList.forEach {_ = firstSymbols.insert(getFirstSymbol(word: $0)) }

    // Build tableSourse array
    var tableViewSourse = [Character : [String]]()

    for symbol in firstSymbols {

        var words = [String]()

        for word in wordList {
            if symbol == getFirstSymbol(word: word) {
                words.append(word)
            }
        }

        tableViewSourse[symbol] = words.sorted(by: {$0 < $1})
    }

    let sortedSymbols = firstSymbols.sorted(by: {$0 < $1})

    return (sortedSymbols, tableViewSourse)
}

func getTableData(words: [String]) {
    tableViewSource = createTableData(wordList: words).source
    tableViewHeaders = createTableData(wordList: words).firstSymbols
}

getTableData(words: data)

print(tableViewSource)  // ["J": ["John"], "C": ["Caesar"], "A": ["Anna", "Anton"]]
print(tableViewHeaders) // ["A", "C", "J"]
Run Code Online (Sandbox Code Playgroud)