2016-01-07 2 views
1

Это проект - словарь простого автомобиля, я использую основные данные из файла CSV, загруженного с сервера.TableView, отображающий неверные данные после segue

Когда я выбираю слово в первом представлении таблицы, запускаю вторую страницу, чтобы прочитать определение в другом представлении таблицы, проблема всегда показывает неправильное слово и определение.

ответ

1

Вы игнорируете номер раздела по пути указателя, который вы получаете от tableView.indexPathForSelectedRow. Для разделенной таблицы вам нужно перевести комбинацию разделов/строк в ссылку на данные.

Стандартный способ сделать это с массивом массивов (например, dictionaryItems:[[Dictionary]]). Таким образом, вы можете получить массив элементов, используя раздел пути индекса во внешнем массиве и конкретный элемент, используя строку пути индекса в массиве, возвращаемую ссылкой раздела.

--- UPDATE с помощью методов, которые требуют изменения кода в DictionaryTableViewController

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // Assume a single section after a search 
    return (searchController.active) ? 1 : sectionTitles.count 
} 


// Create a standard way to get a Dictionary from an index path 
func itemForIndexPath(indexPath: NSIndexPath) -> Dictionary? { 
    var result: Dictionary? = nil 

    if searchController.active { 
     result = searchResults[indexPath.row] 
    } else { 
     let wordKey = sectionTitles[indexPath.section] 
     if let items = cockpitDict[wordKey] { 
      result = items[indexPath.row] 
     } 
    } 
    return result 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! DictionaryTableViewCell 

    if let dictionary = itemForIndexPath(indexPath) { 
     cell.wordLabel.text = dictionary.word 
     cell.definitionSmallLabel.text = dictionary.definition 
    } else { 
     print("Cell error with path \(indexPath)") 
    } 

    return cell 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDictionaryDetail" { 
     if let indexPath = tableView.indexPathForSelectedRow { 
      let destinationController = segue.destinationViewController as! DictionaryDetailViewController 
      if let dictionary = itemForIndexPath(indexPath) { 
       destinationController.dictionary = dictionary 
      } else { 
       print("Segue error with path \(indexPath)") 
      } 
      searchController.active = false 
     } 
    } 
} 
+0

Привет, вы знаете, где я могу найти учебное пособие или помочь в том, как это сделать? :( –

+0

@Jade Теперь игнорируем github .... Я обновлю свой ответ с измененным кодом. –

+0

HI извините за задержку, это отлично работает. Я буду следовать шаг за шагом, чтобы попытаться учиться в следующий раз, спасибо вы очень мне очень помогаете :) –

1

Я проверил ваш код и думаю, беда с destinationController.dictionary = (searchController.active) ? searchResults[indexPath.row] : dictionaryItems[indexPath.row]

вы должны получить словарь, как это (как вы это делали в cellForRowAtIndexPath):

let dictionary = (searchController.active) ? searchResults[indexPath.row]: dictionaryItems[indexPath.row] 
    let wordKey = sectionTitles[indexPath.section] 
    let items = cockpitDict[wordKey] 

Теперь item будет словарем, чтобы перейти к детальному.

У меня возникла эта идея, когда я увидел, что вы очень эффективно заполняете свои данные в виде таблицы.

+0

спасибо, но я действительно не знаю, как это сделать :( –

+3

Хорошая точка. После вызова 'createCockpitDict()' 'dictionaryItems' действительно полезна только для линейных операций, например фильтр –

+3

@Jade Как он указывает в своем ответе, вы ** уже ** делаете это в 'cellForRowAtIndexPath'. –

Смежные вопросы