два UITableView в UICollectionView, используя ту же ссылку? - PullRequest
1 голос
/ 24 октября 2019

У меня есть UICollectionView с 4 представлениями в нем. Каждое из этих представлений имеет внутри UITableView с пользовательскими ячейками. Каждая ячейка UITableView имеет внутри UIButton, и у меня есть 2 ячейки на UITableView.

Что-то странное происходит. У меня есть функция действия для каждой кнопки, чтобы при нажатии кнопки она становилась пурпурной. Странная вещь заключается в следующем: если я прокручиваю до 4-го вида моего собрания и нажимаю на кнопку, он становится фиолетовым, как и ожидалось, но затем, когда я прокручиваю до 1-го вида моего собрания, та же кнопка, которую я нажал вЧетвертый вид (первый или второй) также пурпурный, как если бы четвертый вид моего представления коллекции ссылался на элементы моего первого вида представления коллекции.

Я не знаю, в какой момент1-й вид становится таким же, как 4-й вид, но вот пример кода:

// this is the cellForItemAt of my UICollectionView, very basic
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cellView = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PollCellView
        return cellView
    }

// THIS IS ANOTHER FILE HERE
// this is part of my view that populate the UICollectionViews
class PollCellView: UICollectionViewCell {

    // the table view
    let questAndAnswersTableView : UITableView = {
        let tableView = UITableView()
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.separatorStyle = .none
        tableView.allowsSelection = false
        return tableView
    }()

// I add the tableview in the view here
override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(questAndAnswersTableView)


// a classic cellForRowAt of my UITableView
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "AnswerCell2", for: indexPath) as! AnswerCell2
        return cell
    }


// THIS IS ANOTHER FILE HERE
// this part is my custom cell of the UITableView
class AnswerCell2: UITableViewCell {

    let answerTextButton: UIButton = {
        let answerButton = UIButton()
        answerButton.setTitle("initial text", for: .normal)
        return answerButton
    }()

// I add the button to the cell here
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        addSubview(answerTextButton)
        // I define the action function
        answerTextButton.addTarget(self, action: #selector(answerClicked), for: .touchUpInside)
}

// the action to make the button purple
@objc func answerClicked(sender: UIButton) {
        sender.backgroundColor = UIColor(displayP3Red: 0.6902, green: 0.7176, blue: 0.9922, alpha: 1.0)
}

[РЕДАКТИРОВАТЬ ПОСЛЕ ПОЛУЧЕНИЯ ОТВЕТОВ]

Снятие с очереди определенно не так просто, как сначалаКажется ... Вы не можете доверять тому, что табличное представление, удаленное в данном представлении коллекции, действительно то, что вы ожидаете ... Вам нужно самим отслеживать содержимое (модель). Единственное, что упростило исправление, - это использование замыканий между ячейкой TableView и ячейкой UICollectionViewCell ... Вы можете очень легко передавать данные из одной в другую (например, по нажатию indexPath и т. Д.).

Ответы [ 2 ]

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

Кажется, это вызвано механизмом повторного использования ячеек UICollectionView.

Когда ячейка создается и прокручивается за пределы экрана, она будет повторно использована позже, если потребуется новая ячейка с тем же идентификатором. В вашем случае, когда вы прокручиваете вниз, 1-й вид повторно используется как 4-й вид, а когда вы прокручиваете вверх, 4-й вид повторно используется как первый вид. Если метод prepareForReuse окажется не реализованным, состояние пользовательского интерфейса ячейки не изменится, поэтому вы увидите кнопку с фиолетовым цветом.

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

когда вы управляете несколькими вложенными табличными или коллекционными представлениями или даже когда сами управляете этим, вы должны настроить систему массивов, чтобы при нажатии кнопки вы добавляли эти indexpaths в массив с именем "indexPathsThatArePuple"затем, когда вы после каждого нажатия кнопки, внутри функции нажатия кнопки, вы передаете indexPath и добавляете это в массив. Если кнопка уже находится внутри массива, когда нажата функция нажатия кнопки, вы удаляете этот indexPath. в функции нажатия кнопки, после добавления или удаления indexPaths, вы перезагружаете представление коллекции, которое будет перезагружать представления таблицы, а затем внутри «cellForItemAtIndexPath» вы проверяете массив indexPathsThatArePuple и затем пишете «если indexpath содержится в indexPathsThatArePuple», затем устанавливаете цвет ячейкидо фиолетового.

Я понимаю, что вы пытаетесь сделать, но вы не понимаете или не понимаете, насколько сложна система повторного использования ячеек в iOS. Первое, что вам нужно сделать, это обдумать идею о том, что вы должны вручную управлять состояниями ячеек из-за повторного использования ячеек. Фиолетовая ячейка, показанная в другой таблице, является результатом повторного использования ячейки. Apple не будет автоматически управлять этим для вас, вы должны сделать это самостоятельно. Как я описал выше, и даже мое описание выше не так уж и сложно, поскольку вы, вероятно, будете бороться с этим неделями, пока не поймете концепцию. Удачи, вы в конце концов получите это.

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