【问题标题】:How to pass on data from multiple sections in a UICollectionView如何从 UICollectionView 中的多个部分传递数据
【发布时间】:2016-09-27 15:11:01
【问题描述】:

我是 Swift 新手。我正在尝试在详细视图中显示图像,该图像来自UICollectionViewController。我的问题是:

  1. 如何通过 segue 将数据发送到详细视图?我无法使用if let indexPath = collectionView.indexPathForSelectedRow... 那么正确的方法是什么?
  2. 如何判断用户何时点击来自UICollectionViewController 不同部分的图像,然后将此信息传递给DetailView

AudiUICollectionViewController.swift:

import UIKit

class AudiUICollectionViewController: UICollectionViewController {

var audiPictures01:[carData] = [
                              carData(name:"01", picture:"1"),
                              carData(name:"02", picture:"2"),
                              carData(name:"03", picture:"3"),
                              carData(name:"04", picture:"4"),
                              carData(name:"05", picture:"5"),
                              carData(name:"06", picture:"6")]

var audiPictures02:[carData] = [
                              carData(name:"07", picture:"7"),
                              carData(name:"08", picture:"8"),
                              carData(name:"09", picture:"9"),
                              carData(name:"10", picture:"10"),
                              carData(name:"11", picture:"11"),
                              carData(name:"12", picture:"12")
                              ]


override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 2
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if section == 0 {
        return audiPictures01.count
    } else {
        return audiPictures02.count
    }

}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    if indexPath.section == 0 {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! AudiUICollectionViewCell

        cell.collectionPicture.image = UIImage(named: audiPictures01[indexPath.row].picture)
        return cell
    } else {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! AudiUICollectionViewCell

        cell.collectionPicture.image = UIImage(named: audiPictures02[indexPath.row].picture)
        return cell
    }


}

//I don't know how to set the segue to pass the data

}

AudiDetailViewController.swift:

import UIKit

class audiDetailViewController: UIViewController {

@IBOutlet weak var audiDetailImageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    }
}

【问题讨论】:

  • 您好 Eric,感谢您帮助纠正我糟糕的英语。

标签: swift uicollectionview segue


【解决方案1】:

您可以使用 prepareForSegue() 功能来处理您的控制器之间的数据,从父母到它的孩子或您的 detailViewController,我将 prepareForSegue() 添加到您的代码中,它应该看起来像这样

 import UIKit

 class AudiUICollectionViewController: UICollectionViewController {

 var audiPictures01:[carData] = [
                          carData(name:"01", picture:"1"),
                          carData(name:"02", picture:"2"),
                          carData(name:"03", picture:"3"),
                          carData(name:"04", picture:"4"),
                          carData(name:"05", picture:"5"),
                          carData(name:"06", picture:"6")]

 var audiPictures02:[carData] = [
                          carData(name:"07", picture:"7"),
                          carData(name:"08", picture:"8"),
                          carData(name:"09", picture:"9"),
                          carData(name:"10", picture:"10"),
                          carData(name:"11", picture:"11"),
                          carData(name:"12", picture:"12")
                          ]


override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 2
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if section == 0 {
    return audiPictures01.count
} else {
    return audiPictures02.count
}

}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

if indexPath.section == 0 {
    let cell =          collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! AudiUICollectionViewCell

    cell.collectionPicture.image = UIImage(named: audiPictures01[indexPath.row].picture)
    return cell
} else {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! AudiUICollectionViewCell

    cell.collectionPicture.image = UIImage(named:       audiPictures02[indexPath.row].picture)
    return cell
}


}

//I don't know how to set the segue to pass the data
// use this line of code in your view controller

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    if let detailVC = segue.destinationViewController as? audiDetailViewController {
        if segue.identifier == "showDetailViewController" {
            let selectedRow = self.collectionView!.indexPathForCell((sender as! UICollectionViewCell))
            var category: carData?
            if selectedRow!.section == 0 {
                category = audiPictures01[selectedRow!.row]
            } else {
                category = audiPictures02[selectedRow!.row]
            }
            detailVC.name = category.name
            detailVC.picture = category.picture
        }
    }

}

}

在 DetailViewController 中,您应该为名称和图片创建一个 var,或者您可以只创建您自己的对象的一个​​变量来将数据传递给它。 我只是为“名称”创建了 2 个变量,另一个为“图片”创建了 var,而您的 detailController 看起来像这样

import UIKit

class audiDetailViewController: UIViewController {

@IBOutlet weak var audiDetailImageView: UIImageView!
var picture: String?
var name: String?

override func viewDidLoad() {
    super.viewDidLoad()
         print(name, picture)
    }
}

希望这会有所帮助

【讨论】:

  • 嗨阿拉什,非常感谢您的帮助!但是如果 selectedRow!.section == 0 { category = audiPictures01[selectedRow!.row] } else { category = audiPictures02[selectedRow!.row] } 我在下面的代码中遇到问题,错误消息是:无法分配类型的值' carData' 来输入 '[carData]?'。你能帮我解决吗?谢谢!
  • 来自这一行'var category: [carData]?'将其更改为“var 类别:carData?”它应该可以解决您的问题
  • 另一个问题是当用户点击collectionView中显示的图片时如何在详细视图中获得正确的图片?我正在尝试修改 detailViewController 中的代码,但无法获得任何反馈。你能给我一些打击吗?谢谢! @IBOutlet 弱 var audiDetailImageView:UIImageView! var picture = "" override func viewDidLoad() { super.viewDidLoad() audiDetailImageView.image = UIImage(named: picture) }
  • 您的代码正确,它应该可以正常工作,除非您传递给 DetailView 的图像名称为零,缩小为图像并确保您正确。还有一件事,如果您的图像存储在服务器中并且您想显示该图像 UIImage(named: picture) 您不能使用此方法显示图像
  • 当我清除所有关于 prepareForSegue 的代码然后再次输入时它可以工作。非常感谢您花时间教我并给我很多提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2016-05-05
  • 2018-08-06
相关资源
最近更新 更多