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