Я пытаюсь воссоздать браузер в приложении.Я создал раздел, в котором пользователь может добавлять свои любимые веб-сайты, чтобы они могли отображаться в виде таблицы.Я использую сторонний API для получения и отображения заголовка, описания и значка выбранного веб-сайта.Вот как это работает.Существует два контроллера представления: первый - сам браузер, а второй - любимый контроллер просмотра таблиц, где пользователь может видеть свои любимые веб-сайты.Когда пользователь нажимает на знак «+» в первом контроллере представления, текущий URL сохраняется в массиве с UserDefaults (я столкнулся с некоторыми проблемами при сохранении его с Codable), а затем во втором контроллере представления, табличное представление заполняется вцикл for с каждым URL, который пользователь сохранил.
Проблема заключается в следующем:
Когда пользователь уже добавил различные веб-сайты, он должен прокрутить, чтобы найти все, что он / она сохранил.Однако каждая ячейка табличного представления перерабатывается, поэтому она загружается снова каждый раз, когда пользователь прокручивает вверх и вниз.
Это когда пользователь впервые открывает любимый раздел
Когда пользователь прокручивает
Когда пользователь прокручивает до ячейки табличного представления, которая предположительно уже загружена
Используются следующие два массива:
var modifiedURLS = defaults.object(forKey: "modifiedURLS") as! [String]
var nonModifiedURLS = defaults.object(forKey: "nonModifiedURLS") as! [String]
Я использую два массива, потому что API, который я использую (SwiftLinkPreview), работает только тогда, когда запрашиваемый URL-адрес является нормальным (ничего больше после .com), поэтому я сохраняю измененный URL-адрес для доступа к заголовку, описаниюи свойства favicon с этим API, а также немодифицированный URL, в котором хранится именно тот URL, который пользователь хотел сохранить
Код при заполнении tableviewcontroller следующий:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "favoritesCell", for: indexPath) as! BookmarkTableViewCell
let slp = SwiftLinkPreview(session: .shared, workQueue: SwiftLinkPreview.defaultWorkQueue, responseQueue: DispatchQueue.main, cache: DisabledCache.instance)
cell.titleWebLabel.text = "Loading title..."
cell.descriptionWebLabel.text = "Loading description..."
cell.urlLabel.text = nonModifiedURLS[indexPath.row]
for _ in 0...modifiedURLS.count - 1 {
// The following is an asynchronous request
slp.preview(modifiedURLS[indexPath.row], onSuccess: { result in
let titleIndex = result.index(forKey: SwiftLinkResponseKey.title) as! Dictionary<SwiftLinkResponseKey, Any>.Index
let title:String = result[titleIndex].value as! String
cell.titleWebLabel.text = title
let descriptionIndex = result.index(forKey: SwiftLinkResponseKey.description) as! Dictionary<SwiftLinkResponseKey, Any>.Index
let description:String = result[descriptionIndex].value as! String
cell.descriptionWebLabel.text = description
let favIconIndex = result.index(forKey: SwiftLinkResponseKey.image) as! Dictionary<SwiftLinkResponseKey, Any>.Index
let favIcon = result[favIconIndex].value
cell.favIconImageView.sd_setImage(with: URL(string: "\(favIcon as! String)"))
},
onError: { error in print("\(error)")})
}
return cell
}
Проектможно найти по следующей ссылке GitHub: https://github.com/francisc112/IssueBrowser