Как удалить внутри tableView? - PullRequest
0 голосов
/ 12 июля 2019

У меня есть этот быстрый код для приложения ios.

Я работал над tableView, чтобы провести пальцем влево, чтобы удалить список местоположений, сохраненных пользователем.

Часть с вопросительными знаками - это критический парк, и я не могу понять, что я должен поставить или где здесь ошибка ...

Заранее спасибо

import UIKit
import UserNotifications

class PlacesTableViewController: UITableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()


    NotificationCenter.default.addObserver(
      self,
      selector: #selector(newLocationAdded(_:)),
      name: .newLocationSaved,
      object: nil)
  }

  @objc func newLocationAdded(_ notification: Notification) {
    tableView.reloadData()
  }

  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return LocationsStorage.shared.locations.count
  }




    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete{

            ???.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)

        }

    }

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PlaceCell", for: indexPath)
    let location = LocationsStorage.shared.locations[indexPath.row]
    cell.textLabel?.numberOfLines = 2
    cell.textLabel?.text = location.description
    cell.detailTextLabel?.text = location.dateString
    return cell
  }

  override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 110
  }
}

Ответы [ 3 ]

0 голосов
/ 12 июля 2019

Предполагая, что LocationsStorage.shared.locations является массивом, вы можете использовать LocationsStorage.shared.locations.remove(at: indexPath.row).Если у вас возникли проблемы с этим, пожалуйста, укажите полученную ошибку, чтобы я мог помочь вам

LocationsStorage.shared.locations.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)

В примечании также добавьте beginUpdates и endUpdates, когда вы 'измените tableView, выполнив несколько вставок / удалений.

Редактировать: -

Поскольку вы получаете «Невозможно использовать мутирующий элемент в неизменяемом значении: установщик« местоположения »недоступен», что ясно означает, чтоу вас есть доступ только для чтения к массиву, у вас есть две опции ..

1) Перейдите в одноэлементный класс (класс LocationsStorage) и измените коллекцию locations, чтобы сделать ее изменчивой.(Вы можете / не можете этого делать. Но если у вас есть необходимость изменить массив синглтона через tableView, у вас нет другого выбора)

2) Если вы действительно не чувствуетенеобходимо изменить массив класса singleton, вы можете иметь свою собственную локальную коллекцию в классе, где вы обрабатываете tableView как var myLocationArray = LocationsStorage.shared.locations, и использовать этот массив в качестве источника данных

0 голосов
/ 12 июля 2019

Как LocationsStorage.shared.locations массив данных просто заменить ???с этим

 if editingStyle == .delete{
    LocationsStorage.shared.locations.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .fade)
 }
0 голосов
/ 12 июля 2019

Для того, что я вижу, вы должны удалить из

LocationsStorage.shared.locations

Следующая часть кода выглядит нормально, и тогда вам просто нужно сделать

tableView.reloadData() 

еще раз, чтобы увидеть изменения, отраженные в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...