在多个UICollectionView中显示电影列表的详细视图。

6 浏览
0 Comments

在多个UICollectionView中显示电影列表的详细视图。

我在同一个视图控制器中有多个UICollectionView(准确地说有4个)。我为每个“行”创建了一个容器视图,其中包含一个标题和一个UICollectionView。我为每个UICollectionViewCell创建了一个Segue,以便跳转到详细视图控制器,并为它们设置了一个标识符。但我不明白如何将我的电影对象从容器视图传递到详细页面。

我认为我只需要解决的问题是在ViewController中的prepare函数中找到如何获取IndexPath。希望你能帮助我。

我已经找到了类似于以下的答案:

答案一

我的Segue

4个水平UICollectionView中的2个

0
0 Comments

问题的出现原因:本文作者在使用多个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开发方面似乎遇到了很多困难。不管怎样,非常感谢!

0