在多个UICollectionView中显示电影列表的详细视图。
在多个UICollectionView中显示电影列表的详细视图。
我在同一个视图控制器中有多个UICollectionView(准确地说有4个)。我为每个“行”创建了一个容器视图,其中包含一个标题和一个UICollectionView。我为每个UICollectionViewCell创建了一个Segue,以便跳转到详细视图控制器,并为它们设置了一个标识符。但我不明白如何将我的电影对象从容器视图传递到详细页面。
我认为我只需要解决的问题是在ViewController中的prepare函数中找到如何获取IndexPath。希望你能帮助我。
我已经找到了类似于以下的答案:
问题的出现原因:本文作者在使用多个UICollectionView的情况下,想要从一个UICollectionViewCell中显示详细视图。但是,作者没有展示在"cellForItemAt indexPath"中使用了什么类型的cell,所以作者在这方面进行了一些假设。
解决方法:作者给出了一种方法,通过prepareForSegue方法将数据从collectionViewCell传递到目标视图控制器。在prepareForSegue方法中,需要完成以下三个步骤:
1. 需要知道在"cellForItemAt indexPath"中使用的cell类型。在这个例子中,作者使用了一个名为"MovieCell"的cell类。
2. 需要获取选定行的indexPath。UICollectionView有一个名为indexPath(for:)的方法,它接受一个collectionViewCell作为参数,可以用来获取选定行的indexPath。
3. 从与选定行对应的数组中获取信息。
还有一些示例代码,用于说明如何在prepareForSegue方法中完成这些步骤。
文章如下:
考虑到您没有展示在"cellForItemAt indexPath"中使用了什么类型的cell,我不得不做一些假设,以便让您清楚。我也不知道您所说的有4个collectionView是什么意思,但这是一种使用一个collectionView通过prepareForSegue方法将数据从collectionViewCell传递到目标视图控制器的方式之一。
在prepareForSegue方法中,您需要完成以下三个步骤:
1. 您需要知道在"cellForItemAt indexPath"中使用的cell类型。在这个例子中,我使用了一个名为"MovieCell"的cell类。
2. 您需要获取选定行的indexPath。UICollectionView有一个名为indexPath(for:)的方法,它接受一个collectionViewCell作为参数:collectionView.indexPath(for: UICollectionViewCell)。
3. 获取与选定行对应的数组中的信息。
例如,您有一个名为MovieDataModel的类,其中有一个movieName属性:
class MovieDataModel{
var movieName: String?
}
collectionView的cell名为MovieCell,其中有一个名为movieTitleLabel的outlet:
class DetailedSearchComplaintCollectionCell: UICollectionViewCell {
weak var movieTitleLabel: UILabel!
}
在拥有collectionView的类中:
weak var collectionView: UICollectionView! // 在这个例子中只有一个collectionView
let movies = [MovieDataModel]() // 一个MovieDataModel的数组
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return movies.count // 返回movies数组中的项数
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "movieCell", for: indexPath) as! MovieCell // 将cell转换为MovieCell
cell.movieTitleLabel.text = movies[indexPath.row].movieName! // 这是我们需要的第3步信息
return cell
}
// sender参数<<<
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "MovieDetailsPlaying"){
// 来自上面的步骤
let cell = sender as! MovieCell // 与cellForItemAt indexPath中使用的相同类型的cell。使用prepareForSegue签名中的sender参数访问它,然后将其转换为MovieCell
let indexPath = collectionView.indexPath(for: cell) // 从被点击的行获取indexPath。将步骤1中的cell作为参数传递给它。请注意,它说的是collectionView,因为那是collectionView outlet的名称。我不确定如何在4个不同的collectionView中使用这个方法,但您可能需要为每个collectionView创建一个indexPath。这只是一个假设
var destination = segue.destination as! DetailMovieController
destination.item = movies[indexPath!.row].movieName // 第3步,从movies数组和它的标题中获取与indexPath(被点击的行)对应的MoviesDataModel项。
}
}
我不知道您使用的collectionView cell的名称,但是在拥有collectionView的类中,无论您在哪里看到MovieCell的名称,都将其更改为您使用的cell的名称。
我只需要这一行let indexPath = collectionView.indexPath(for: cell)。非常感谢你! 🙂
我不确定您的技能水平如何,所以对我来说,把一切都解释清楚是比较容易的,但是是的,您是正确的,这就是您需要的,而且在那之前的一行,当您转换cell时确实需要它。
啊,我明白了。我已经开发了几个Android商业应用程序,但是在iOS开发方面似乎遇到了很多困难。不管怎样,非常感谢!