Невозможно отменить выбор ранее выбранной ячейки, если в табличном представлении выбрана новая, где каждая ячейка содержит табличное представление - PullRequest
0 голосов
/ 30 октября 2019

У меня есть табличное представление, где каждая ячейка является настраиваемой ячейкой табличного представления. Эта пользовательская ячейка таблицы содержит таблицу и метку. Допустим, внешний табличный вид называется MainTableView. Каждая ячейка MainTableView состоит из другого табличного представления. Проблема в том, что когда я выбираю внутреннюю ячейку таблицы один за другим, ранее выбранная ячейка не отменяется. На первом изображенном мной изображении ячейка содержит текст «Два». Затем во втором изображении я выделил ячейку, содержащую текст «Пять», но ранее выделенную ячейку «Два» все еще в режиме выделения. Я хочу отменить выбор предыдущей ячейки при выборе новой.

First Image Second Image

Я пробовал

tableView.deselectRow(at: IndexPath, animated: Bool)

этот метод внутри didSelectRowAt в пользовательском классе tableviewcell, но он не служил цели, потому что предыдущий indexPath был из отдельного представления таблицы. Итак, как я могу отменить выбор предыдущего?

Ответы [ 3 ]

1 голос
/ 30 октября 2019

, чтобы получить правильный внутренний tableView,

Во-первых, , вы должны записать в индексную ячейку внешнего tableView, в какой ячейке находится внутренний tableView.

Так что вы должнызапишите две indexPathes

var selectionRowInfo: (lastOutsideIP: IndexPath?, lastInnerIP: IndexPath?)

Во-вторых , вы получите правильный tableView через outsideTableView.

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

остальное условие , вам не нужно справляться с этим. Механизм повторного использования tableView обновит свое состояние.

    // pseudo code.


    if let lastOut = lastOutsideIP, let visibleRows = outTableView.indexPathsForVisibleRows, visibleRows.contains(lastOut){
        let cell = tableView.cellForRow(at: lastOut) as! YourCell
        // get the correct inner tableView via the cell
    }

Поскольку внутренние tableViews не связаны друг с другом. Выберите ячейку таблицы один, это не повлияет на выбор ячейки таблицы 2.

Таким образом, вы должны создать соединение вручную.

Используйте свойство для хранения состояния var lastIndexPath: IndexPath?,

, затем каждый раз выбирайте indexPath,

  // pseudo code.
  if let last = lastIndexPath{
        tableView.deselectRow(at: last, animated: true) 
  }

Обратите внимание, что вы должны найти правильный внутренний tableView, который имеет lastIndexPath

0 голосов
/ 31 октября 2019

Я решил проблему, используя идею первого ответа, данного dengApro. Идея состояла в том, чтобы найти правильную внутреннюю таблицу, которая содержит ранее выбранную ячейку. У меня есть два файла, один - ViewController.swift, который содержит внешний вид таблицы MainTableView. Еще один - CustomTableViewCell.swift с CustomTableViewCell.xib, который содержит настраиваемую ячейку с табличным представлением.

fileprivate var lastSelectedInnerTableView : Int = -1
fileprivate var lastSelectedRow: Int = -1
fileprivate var tableViewList :[UITableView] = []

Я добавил эти 3 переменные в файл CustomTableViewCell.swift вне класса CustomTableViewCell. lastSelectedSection, lastSelectedRow эти 2 переменные используются для отслеживания последнего выбранного внутреннего табличного представления (lastSelectedInnerTableView) и последней выбранной ячейки этого внутреннего tableView (lastSelectedRow). Переменная tableViewList используется для хранения внутреннего TableView. Внутри awakeFromNib () я добавляю созданные внутренние представления таблиц.

override func awakeFromNib() {
    super.awakeFromNib()
    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    tableViewList.append(self.tableView) // append the created inner tableviews
}

Затем внутри didSelectRowAt я отменил выбор предыдущего:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if lastSelectedInnerTableView != -1 && lastSelectedRow != -1{
        self.oldIndexPath.section = 0
        self.oldIndexPath.row = lastSelectedRow
        tableViewList[lastSelectedInnerTableView].deselectRow(at: self.oldIndexPath, animated: true)
    }

    lastSelectedInnerTableView = self.innerTableId
    lastSelectedRow = indexPath.row
}

В ViewController.swift я установил innerTableId внутри cellForRowAt

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let customCell: CustomTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "customCell") as! CustomTableViewCell
    customCell.innerTableId = indexPath.row
    customCell.customCellActionDelegate = self

    return customCell
}
0 голосов
/ 30 октября 2019

Предыдущий ответ идет по правильным линиям, но имеет недостаток - он не может различить tableViews, который является наиболее важной частью. Также, если у tableViews есть различное количество строк, это рискует попытаться получить доступ к несуществующей строке и вызвать сбой.

Отслеживание выбранной строки в двух tableViews (tv1 & tv2)вам нужно будет держать выбранную строку в каждом:

var tv1, tv2: UITableView!
var lastRowForTV1, lastRowForTV2: IndexPath?

, а затем отвечать на выборки, идентифицируя используемый tableView и настраивая другой (это предполагает, что два tableView используют один и тот же источник данных / делегат)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      if tableView === tv1 {
         lastRowForTV1 = indexPath
         if let last = lastRowForTV2 {
            tv2.deselectRow(at: last, animated: true)
            lastRowForTV2 = nil
         }
      } else if tableView === tv2 {
         lastRowForTV2 = indexPath
         if let last = lastRowForTV1 {
            tv1.deselectRow(at: last, animated: true)
            lastRowForTV1 = nil
         }
      }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...