インデックス付きオブジェクトをテーブルビューで表示する際に問題が発生しています。彼らの名前の最初の文字に基づいてクライアントのリストとしてオブジェクトを索引付けしました。インデックス付きの結果は、このディクショナリ内の配列によるインデックスエラー(Swift 3.0)
{Char: [Client]}
シャアは、クライアントの名前と[クライアント]シャアに一致する自分の名前の最初の文字を持っているクライアントオブジェクトの配列であることの最初の文字であることのように辞書に入れています。プリントアウトすると、これは次のように現れます:
{'D': [Client("David"), Client("Dan")]}
をしかし、私はのtableViewでこれらのタイトルを設定するために行くとき(_のtableView:のUITableView、cellForRowAt indexPath:IndexPath)機能、私は境界エラーのうちのインデックスを取得。クライアントの配列は3の数を持っており、連絡先辞書は、2の数を持っていますが、持っているような、すべての3つのオブジェクトを:
{'S': [Client("Sam")], 'D': [Client("David"), Client("Dan")]}
私は適切に各テーブルセルに個々のクライアントを取得するために辞書を通過するにはどうすればよいです適切なセクションヘッダーを使用していますか?私はSwift 3.0を使用しています。以下では、どのようにインデックスを作成したか、上書きしようとしている関数を投稿しました。
ClientTableViewController.swift
var clients = Client.loadAllClients()
var contacts = [Character: [Client]]()
var letters: [Character] = []
override func viewDidLoad() {
super.viewDidLoad()
letters = clients.map { (name) -> Character in
return name.lName[name.lName.startIndex]
}
letters = letters.reduce([], { (list, name) -> [Character] in
if !list.contains(name) {
return list + [name]
}
return list
})
for c in clients {
if contacts[c.lName[c.lName.startIndex]] == nil {
contacts[c.lName[c.lName.startIndex]] = [Client]()
}
contacts[c.lName[c.lName.startIndex]]!.append(c)
}
for (letter, list) in contacts {
contacts[letter] = list.sorted(by: { (client1, client2) -> Bool in
client1.lName < client2.lName
})
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Name", for: indexPath) as! ClientTableViewCell
cell.clientName?.text = contacts[letters[indexPath.row]]?[indexPath.row].lName
return cell
}
アルファベットの各文字にセクションを追加し、そのセクションの各連絡先にセルを続けますか? – Pierce
セクション数と行数を設定すると、コードはどのように見えますか? – jherg
セクションをまったく使用していないようです。あなたは1文字につき1つのセクションを持ち、 'cellForRow'で適切な連絡先を見つけるためにそれを使う必要があります – Paulw11