如何将集合视图数据传递给新的视图控制器

时间:2017-01-24 15:28:46

标签: xcode core-data swift3 uicollectionview

我将尝试尽可能具体。

我想要实现的是拥有一个视图控制器,其中包含一个集合视图,当用户点击集合视图单元格时,它会将用户发送到另一个具有另一个集合视图的视图控制器,但是第二个集合视图中显示的项目将根据用户先前点击的集合视图单元格而变化。我也在使用CoreData来做这件事。使用CoreData,任务是一个实体,并具有名称等属性。我是否必须更改此项或在2个集合视图之间建立关系?

我想要这样做的原因是因为我正在为iOS创建一个生产力应用程序,第一个带有集合视图的视图控制器将是用户可以在这些项目中创建项目的地方,这些项目将显示在集合视图中然后,用户可以点击其中一个单元格并转到下一个视图控制器,并开始创建特定于该项目的任务。

如何将任务保存在特定的集合视图单元格中,让用户在其他项目中创建不同的任务。它有点像Wunderlist。如果有人对我想做的事感到困惑,我可以更多地说清楚。

这是我的一个视图控制器,其中来自'创建项目视图控制器的数据'通过CoreData发送并将其显示在集合视图中,希望它有所帮助:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {


@IBOutlet weak var myCollView: UICollectionView!

@IBAction func addCore(_ sender: UIButton) {


}

var tasks : [Task] = []


override func viewDidLoad() {
    super.viewDidLoad()
    self.myCollView.delegate = self
    self.myCollView.dataSource = self


}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    getData()
    myCollView.reloadData()

}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return tasks.count
}

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

    let task = tasks[indexPath.row]

    cell.labelTe?.text = task.name!

    self.myCollView.backgroundColor = UIColor.clear
    cell.layer.cornerRadius = 25
    return cell


}

func getData() {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
    tasks = try context.fetch(Task.fetchRequest())
    }

    catch {
     print("Ahhhhhhhh")
    }

}

1 个答案:

答案 0 :(得分:1)

如果我正确猜测,并且在单击第一个集合视图上的单元格时,您想要转到另一个集合视图,您将根据所选单元格显示显示数据。

要实现此目的,只需在第一个视图控制器中添加collectionView(_ collectionView:, didSelectItemAt indexPath:)prepare(for segue:, sender:)功能。

collectionView(_ collectionView:, didSelectItemAt indexPath:)函数中,通过确定选择了哪个单元格来获取所选任务的ID,然后将此id传递给prepare(for segue:, sender:)函数中的第二个视图控制器。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let cell = collectionView.cellForItem(at: indexPath) as! MyCollectionViewCell
            id = cell.labelTe?.text
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            id = tasks[indexPath.row].id
}

然后将prepare(for segue:, sender:)函数中的此值传递给第二个viewController。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "YourIdentifier"{
            let destinationViewController = segue.destination as! SecondViewController
                destinationViewController.id = id
        }
    }

确保在viewControllers中添加var id。在第二个viewController中,使用此id来获取要显示的所选任务的数据。

希望这有帮助。

修改 只需在viewControllers中声明特定类型的新变量id即可。在你的第一个viewController中:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

var id = ""

并在第二个viewController中

class secondViewController: UIViewController {

var id = ""

确保两个变量的类型相同。