Как я могу выяснить, какая ячейка tableView выбрана, когда коллекционное представление прокручивается горизонтально - PullRequest
0 голосов
/ 20 мая 2018

У меня есть collectionView внутри TableViewCell.TableView имеет 1 секцию и 4 строки.

Я хочу выяснить, какая строка ячейки tableview выбрана, когда collectionView прокручивается горизонтально.

Я попытался выяснить, поместив строку tableView в "var nowRow""переменная как в коде ниже.Но это не работает.

Как я могу узнать, какая строка ячейки tableview выбрана?

class Home2ViewController: UIViewController, UITableViewDataSource,  UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate {

    var posts = [Post]()
    var nowRow = Int()

    override func viewDidLoad() {
        // get posts elements here 
        //posts.append(element).......
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return posts.count // 4counts 

    }

    func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       // let cell = DetailMutiTableViewCell()
        let cell = tableView.dequeueReusableCell(withIdentifier: "DetailMutiTableViewCell", for: indexPath) as! DetailMutiTableViewCell

        nowRow = indexPath.row

        cell.post = posts[nowRow]
        cell.collectionView1.delegate = self
        cell.collectionView1.dataSource = self

        cell.collectionView1.reloadData()
        return cell
    }



    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts[nowRow].imageUrls.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MultiImagesCollectionViewCell", for: indexPath) as! MultiImagesCollectionViewCell

        let photoUrlString = posts[nowRow].imageUrls[indexPath.item] // ←error occured
            let photoUrl = URL(string: photoUrlString)
            cell.imageView1.sd_setImage(with: photoUrl)


        return cell
    }
}

editeditedit

1 Ответ

0 голосов
/ 20 мая 2018

Поскольку вы, несомненно, обнаружили, взаимодействие с collectionViews в строках таблицы не вызывает метод tableView tableView(_:didSelectRowAt:), а tableView.indexPathForSelectedRow равен nil, поскольку ни одна строка не была выбрана.Вам нужен способ сопоставления с collectionView на indexPath.row, который его содержит.Эта информация известна во время установки tableViewCell.

Добавьте к вашему Home2ViewController словарь, который отображает UICollectionView в строку Int:

var collectionViewRow = [UICollectionView : Int]()

Добавьте записив tableView(_:cellForRowAt:), где вы знаете row и collectionView:

collectionViewRow[cell.collectionView1] = indexPath.row

Затем, когда у вас есть collectionView, вы можете посмотреть его строку:

let row = collectionViewRow[collectionView]!

Вот весь код:

class Home2ViewController: UIViewController, UITableViewDataSource,  UITableViewDelegate, UICollectionViewDataSource, UICollectionViewDelegate {

    var posts = [Post]()
    var collectionViewRow = [UICollectionView : Int]()

    override func viewDidLoad() {
        // get posts elements here
        //posts.append(element).......
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return posts.count // 4counts
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // let cell = DetailMutiTableViewCell()
        let cell = tableView.dequeueReusableCell(withIdentifier: "DetailMutiTableViewCell", for: indexPath) as! DetailMutiTableViewCell

        collectionViewRow[cell.collectionView1] = indexPath.row

        cell.post = posts[indexPath.row]
        cell.collectionView1.delegate = self
        cell.collectionView1.dataSource = self

        cell.collectionView1.reloadData()
        return cell
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        let row = collectionViewRow[collectionView]!
        return posts[row].imageUrls.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MultiImagesCollectionViewCell", for: indexPath) as! MultiImagesCollectionViewCell

        let row = collectionViewRow[collectionView]!
        let photoUrlString = posts[row].imageUrls[indexPath.item] // ←error occured
        let photoUrl = URL(string: photoUrlString)
        cell.imageView1.sd_setImage(with: photoUrl)

        return cell
    }
}

Примечания:

  1. Принудительное развертывание поиска по словарю не завершится неудачей, потому что там будет collectionView.Если вы хотите развернуть его с помощью if let, вам нужно решить, что делать, если у вас нет строки (чего не должно быть).
  2. Этот метод может завершиться ошибкой, если ваша таблица позволяетредактирование (пользователь может изменить порядок строк или удалить строки).Если вы не поддерживаете редактирование, то это будет работать нормально.Для поддержки редактирования вы можете изменить словарь на [UICollectionView : UITableViewCell].Затем, получив UICollectionView, вы можете найти его cell, а затем позвонить let indexPath = tableView.indexPath(for: cell), чтобы получить indexPath, и ваш ряд будет просто indexPath.row.
...