2017-02-10 2 views
0

インデックス付きオブジェクトをテーブルビューで表示する際に問題が発生しています。彼らの名前の最初の文字に基づいてクライアントのリストとしてオブジェクトを索引付けしました。インデックス付きの結果は、このディクショナリ内の配列によるインデックスエラー(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 
} 
+0

アルファベットの各文字にセクションを追加し、そのセクションの各連絡先にセルを続けますか? – Pierce

+2

セクション数と行数を設定すると、コードはどのように見えますか? – jherg

+1

セクションをまったく使用していないようです。あなたは1文字につき1つのセクションを持ち、 'cellForRow'で適切な連絡先を見つけるためにそれを使う必要があります – Paulw11

答えて

0

これを返すためにnumberOfSectionsメソッドを実装することで、文字ごとに1つのセクションを作成します。

cell.clientName?.text = contacts[letters[indexPath.row]]?[indexPath.row].lName 
:このからcellForRowAtで

return letters.count 

を変更するコード

これまで:

cell.clientName?.text = contacts[letters[indexPath.section]]?[indexPath.row].lName 
関連する問題