2017-02-10 1 views
0

У меня проблема с отображением индексированных объектов в виде таблицы. Я проиндексировал объекты как список клиентов на основе первой буквы их имени. Индексированные результаты помещаются в словарь, как этоОшибка индексирования с помощью массива в словаре (Swift 3.0)

{Char: [Client]} 

Char является первым символом имени клиента и [Client], являющегося массив клиентских объектов, которые имеют первую букву своего имени, совпадающее с Чаром. Когда распечатывается, это проявляется так:

{'D': [Client("David"), Client("Dan")]} 

Однако, когда я иду, чтобы установить эти названия в Tableview (_ Tableview: UITableView, cellForRowAt indexPath: IndexPath) функция, я получаю индекс из оценки точности , Массив клиента имеет счетчик 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

Вы, кажется, не используете разделы вообще. Вы должны иметь один раздел за письмо и использовать его для поиска правильного контакта в 'cellForRow' – Paulw11

ответ

0

Создать одну секцию для каждой буквы, путем внедрения метода NumberOfSections вернуть это:

return letters.count 

Изменить код в cellForRowAt от этого:

cell.clientName?.text = contacts[letters[indexPath.row]]?[indexPath.row].lName 

К этому:

cell.clientName?.text = contacts[letters[indexPath.section]]?[indexPath.row].lName 
Смежные вопросы