#ios #swift #uitableview #tableview
#iOS #swift #uitableview #просмотр таблицы
Вопрос:
У меня есть TabBarController, и на одной из вкладок я могу выбрать любой документ, который будет находиться на вкладке «Избранное».
Поэтому, когда я перехожу на вкладку «Избранное», должны появиться избранные документы.
Я вызываю перезагрузку после извлечения из CoreData избранных документов:
override func viewWillAppear(_ animated: Bool) {
languageSelected = UserDefaults().string(forKey: "language")!
self.title = "favourites".localized(lang: languageSelected)
// Sets the search Bar in the navigationBar.
let search = UISearchController(searchResultsController: nil)
search.searchResultsUpdater = self
search.obscuresBackgroundDuringPresentation = false
search.searchBar.placeholder = "searchDocuments".localized(lang: languageSelected)
navigationItem.searchController = search
navigationItem.hidesSearchBarWhenScrolling = false
// Request the documents and reload the tableView.
fetchDocuments()
self.tableView.reloadData()
}
Функция fetchDocuments() выглядит следующим образом:
func fetchDocuments() {
print("fetchDocuments")
// We make the request to the context to get the documents we want.
do {
documentArray = try context.fetchMOs(requestedEntity, sortBy: requestedSortBy, predicate: requestedPredicate)
***print(documentArray) // To test it works ok.***
// Arrange the documentArray per year using the variable documentArrayPerSection.
let formatter = DateFormatter()
formatter.dateFormat = "yyyy"
for yearSection in IndexSections.sharedInstance.allSections[0].sections {
let documentsFilteredPerYear = documentArray.filter { document -> Bool in
return yearSection == formatter.string(from: document.date!)
}
documentArrayPerSection.append(documentsFilteredPerYear)
}
} catch {
print("Error fetching data from context (error)")
}
}
Из инструкции print(documentArray) Я вижу, что функция обновляет содержимое. Однако в TableView нет перезагрузки документов.
Если я закрою приложение и снова открою его, оно обновится.
Не знаю, что я делаю не так!!!
Комментарии:
1. Единственное, что я могу считать проблемой, это то, что
fetchMOs
выполняется в фоновом потоке, поэтомуtableView.reloadData()
это происходит доdocumentArray
обновления. Так ли это?2. Это не так. Это функция: func fetchMOs (_ EntityName: String, sortBy: [NSSortDescriptor]? = nil, предикат: NSPredicate? = ноль) выдает -> [Document] { пусть запрос = NSFetchRequest<NSFetchRequestResult>(EntityName: EntityName) запрос.Возвращает objectsasfaults = ложный запрос.предикат = запрос предиката.Сортировка описаний = сортировка по возврату попробуйте! self. выборка (запрос) как! [Документ]}
3. когда-
documentArrayPerSection
нибудь очищается? Разве вы не всегда добавляете к нему при переключении вкладок?4. Просто из любопытства, что произойдет, если вы перейдете
tableView.reloadData()
вviewDidAppear
?5. @TomPearson ты был прав!!!!!!!! Это была проблема очистки documentArrayPerSection!!!!!!!!
Ответ №1:
Проблема в том, что вы всегда добавляете documentArrayPerSection
, но никогда не очищаете его, поэтому я полагаю, что массив всегда увеличивался, но использовалось только начало массива, который запрашивал источник данных TableView. Сам был там несколько раз.
Комментарии:
1. @jRuMoL рад помочь
![]()
Ответ №2:
Я предполагаю, что reloadData()
это вызывается до завершения всей обработки данных. Чтобы исправить это, вам нужно будет вызвать обработчик завершения при выполнении выборки и только после этого обновить TableView.
func fetchDocuments(_ completion: @escaping () -> Void) {
do {
// Execute all the usual fetching logic
...
completion()
}
catch { ... }
}
И назовите это так:
fetchDocuments() {
self.tableView.reloadData()
}
Удачи