Я думаю, что ваша путаница связана с тем, как UITableViewControllers работает в отношении отображения и обновления данных. В конечном счете, источник данных UITableView отвечает за предоставление правильных данных для отображения. Вы не хотите напрямую обновлять ячейку. Вместо этого вы просите перезагрузить представление таблицы, а затем убедитесь, что соответствующий метод источника данных предоставит нужные вам данные (в этом случае cellForRowAt - это метод, который нас больше всего интересует). У меня есть кое-что, что, по сути, делает то, что вы хотели, что, надеюсь, поможет вам начать в правильном направлении.
Это не 100%, как вы описали как пролистывание влево, как правило, используется табличным представлением, чтобы указать, что пользователь пытается удалить ячейку. Как пример написан ниже, левые пролистывания никогда не будут регистрироваться. Поэтому длительное использование жестов смахивания, как вы описываете, может быть не лучшим выбором.
class TableViewController: UITableViewController {
let dataArray1 = ["1", "2", "3"]
let dataArray2 = ["red", "blue", "green"]
var activeArray = 1
override func viewDidLoad() {
super.viewDidLoad()
let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:)))
view.addGestureRecognizer(rightSwipe)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "reuseId", for: indexPath)
cell.textLabel?.text = activeArray == 1 ? dataArray1[indexPath.row] : dataArray2[indexPath.row]
return cell
}
@objc func handleSwipe(_ sender: UISwipeGestureRecognizer) {
if sender.state == .ended {
switch sender.direction {
case .right:
self.activeArray = 2
self.tableView.reloadData()
case .left:
self.activeArray = 1
self.tableView.reloadData()
default:
break
}
}
}
}