Sobes.tech
Middle

Kaip galima įgyvendinti funkcionalumą, gauti paspaustos stulpelio indeksą ir pakeisti kitos stulpelio spalvą dešimtyje stulpelių ir penkiuose blokuose?

sobes.tech AI

Atsakymas iš AI

Используя UICollectionView или UITableView.

Для UICollectionView:

  1. Реализовать делегата UICollectionViewDelegate.
  2. В методе collectionView(_:didSelectItemAt:) получить indexPath.item (индекс колонки в секции).
  3. Определить индекс другой колонки для изменения цвета (например, indexPath.item + 1 или заданный индекс).
  4. Получить ячейку по этому другому индексу с помощью collectionView.cellForItem(at: IndexPath(item: другой_индекс, section: indexPath.section)).
  5. Изменить цвет фона или другого элемента ячейки.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let tappedColumnIndex = indexPath.item
    print("Тап по колонке с индексом: \(tappedColumnIndex)")

    // Пример: изменить цвет следующей колонки
    let nextColumnIndex = tappedColumnIndex + 1
    if nextColumnIndex < collectionView.numberOfItems(inSection: indexPath.section) {
        let nextIndexPath = IndexPath(item: nextColumnIndex, section: indexPath.section)
        if let cell = collectionView.cellForItem(at: nextIndexPath) {
            // Изменяем цвет фона ячейки
            cell.contentView.backgroundColor = .blue
        }
    }
}

Для UITableView с несколькими секциями, каждая представляющая блок, и ячейками в секции, представляющими колонки:

  1. Реализовать делегата UITableViewDelegate.
  2. В методе tableView(_:didSelectRowAt:) получить indexPath.row (индекс колонки в блоке) и indexPath.section (индекс блока).
  3. Определить индекс другой колонки для изменения цвета (например, indexPath.row + 1) в том же или другом блоке.
  4. Получить ячейку по этому другому индексу с помощью tableView.cellForRow(at: IndexPath(row: другой_индекс_колонки, section: другой_индекс_блока)).
  5. Изменить цвет фона или другого элемента ячейки.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let tappedColumnIndex = indexPath.row
    let tappedBlockIndex = indexPath.section
    print("Тап по колонке \(tappedColumnIndex) в блоке \(tappedBlockIndex)")

    // Пример: изменить цвет следующей колонки в том же блоке
    let nextColumnIndex = tappedColumnIndex + 1
    if nextColumnIndex < tableView.numberOfRows(inSection: indexPath.section) {
        let nextIndexPath = IndexPath(row: nextColumnIndex, section: indexPath.section)
        if let cell = tableView.cellForRow(at: nextIndexPath) {
            // Изменяем цвет фона ячейки
            cell.contentView.backgroundColor = .red
        }
    }
}

Важные нюансы:

  • Для правильного отображения изменений цвета при повторном использовании ячеек (dequeuing) необходимо сохранить состояние (какие колонки изменены) и применять его в методах collectionView(_:cellForItemAt:) или tableView(_:cellForRowAt:).
  • Вместо изменения цвета самой ячейки, лучше изменять цвет представления внутри нее (например, contentView.backgroundColor).
  • При десяти колонках и пяти блоках, UICollectionView с настройками для горизонтального скролла (или UIStackView внутри UITableViewCell) может быть более подходящим архитектурным решением, представляя колонки как элементы внутри ячеек.
  • Если "пять блоков" подразумевают 5 независимых наборов из 10 колонок, то UITableView с 5 секциями, каждая из которых содержит 10 ячеек, тоже является рабочим вариантом.
  • UIStackView внутри ячейки UITableViewCell или UICollectionViewCell может представлять 10 колонок, и при тапе на один из subviews (представляющий колонку), можно определить его индекс и изменить цвет другого subview. Для определения тапа на subview в UIStackView можно использовать UITapGestureRecognizer.
// Пример с UITextField в UIStackView внутри UITableViewCell
class ColumnCell: UITableViewCell {
    let stackView = UIStackView()
    var columnTappedHandler: ((Int, Int) -> Void)? // (blockIndex, columnIndex)

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupStackView()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupStackView() {
        stackView.axis = .horizontal
        stackView.distribution = .fillEqually
        contentView.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            stackView.topAnchor.constraint(equalTo: contentView.topAnchor),
            stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
        ])

        // Добавляем 10 текстовых полей как колонки
        for i in 0..<10 {
            let textField = UITextField()
            textField.borderStyle = .roundedRect
            textField.textAlignment = .center
            // Добавляем распознаватель жестов
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleColumnTap(_:)))
            textField.addGestureRecognizer(tapGesture)
            textField.isUserInteractionEnabled = true
            textField.tag = i // Идентификатор колонки
            stackView.addArrangedSubview(textField)
        }
    }

    @objc private func handleColumnTap(_ gesture: UITapGestureRecognizer) {
        guard let tappedView = gesture.view else { return }
        let columnIndex = tappedView.tag
        // Получаем индекс блока из внешнего контекста (например, через хранимое свойство ячейки, установленное в cellForRowAt)
        let blockIndex = 0 // Пример: нужно получить реальный индекс блока
        columnTappedHandler?(blockIndex, columnIndex)
    }

    // Метод для изменения цвета колонки извне
    func setColumnColor(columnIndex: Int, color: UIColor) {
        if columnIndex < stackView.arrangedSubviews.count {
            stackView.arrangedSubviews[columnIndex].backgroundColor = color
        }
    }
}

// В методе tableView(_:cellForRowAt:)
// Устанавливаем columnTappedHandler и передаем текущий indexPath.section
// Внутри хэндлера вызываем tableView.cellForRow(at:) для получения нужной ячейки и setColumnColor на ней.