如何将集合视图数据传递给新的视图控制器
Posted
技术标签:
【中文标题】如何将集合视图数据传递给新的视图控制器【英文标题】:How to Pass Collection View Data to a New View Controller 【发布时间】:2017-01-24 15:28:45 【问题描述】:我会尽量做到具体。
我想要实现的是拥有一个其中包含集合视图的视图控制器,当用户单击集合视图单元格时,它将用户发送到另一个具有另一个集合视图的视图控制器,但是第二个集合视图中显示的项目将根据用户先前点击的集合视图单元格而改变。我也在使用 CoreData 来做到这一点。使用 CoreData,任务是一个实体,并且具有名称等属性。我是否必须更改它或在 2 个集合视图之间建立关系?
我想要这样做的原因是因为我正在为 ios 创建一个生产力应用程序,第一个带有集合视图的视图控制器将是用户可以在这些项目中创建项目的地方,这些项目将显示在集合视图中,然后用户可以点击其中一个单元格并转到下一个视图控制器并开始创建特定于该项目的任务。
如何将任务保存在特定的集合视图单元格中,并让用户在其他项目中创建不同的任务。它有点像奇妙清单。如果有人对我想做的事情感到困惑,我可以详细说明。
这是我的视图控制器之一,来自“创建项目视图控制器”的数据通过 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")
【问题讨论】:
应该可能会发布与此相关的代码。另外,我认为您想将数据从单元格传递到详细视图控制器是否正确? @CalebKleveter 发布了我的主视图控制器代码,并且我想从一个单元格传递数据以关联到另一个视图控制器中的另一个集合视图单元格,以便如果按下该特定单元格然后它显示某些项目,如果用户按下另一个单元格,则会显示不同的集合视图单元格。非常感谢 【参考方案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
确保在两个 viewController 中都添加一个 var id。在第二个 viewController 中,使用此 id 获取您要显示的所选任务的数据。
希望这会有所帮助。
编辑
只需在两个 viewController 中声明您的特定类型的新变量 id
。在你的第一个 viewController 中:
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate
var id = ""
在第二个viewController中
class secondViewController: UIViewController
var id = ""
只要确保两个变量的类型相同。
【讨论】:
非常感谢您的回答,您能否告诉我您在两个视图控制器中创建“var id”的含义,我对 Xcode 很陌生,所以不确定是否要获取数据等等。再次感谢! 非常感谢您的编辑,我现在声明了这两个变量并添加了 segue 和 didSelect 但是我不确定如何使用 id 从 CoreData 获取数据。此外,我不确定如何保存任务,以便它保存与一个集合视图单元格而不是另一个集合视图单元格相关。如果你能帮我完成最后一步,那就太好了,我的电子邮件是richardwesselsofficial@gmail.com,如果你能给我发一封电子邮件,我可以更容易地向你展示我的项目和问题。非常感谢! 是的,我正在关注 YouTube 教程,最近一直在研究 prepareForSegue 函数,但是仍然不太确定如何使集合视图单元格仅显示已保存到其中并环顾四周的任务如何使用标识符保存但收效甚微,我对 Xcode 还是很陌生,不确定很多概念。很抱歉拖出这个问题,但如果您可以给我发电子邮件或举一个使用 id 与 CoreData 一起显示的示例。非常感谢! 尝试向 appcoda 学习。他们提供了相当不错的教程和书籍,您可以从他们那里购买。他们涵盖了从上到下的所有内容,并不断更新新的操作系统。他们可能真的会帮助你。 感谢来源,问题是我正在开发一个待办事项列表应用程序,它需要在 3 月 1 日之前准备好分发,这个问题与与 CoreData 的另一个集合视图相关的集合视图正在严重减慢开发速度,因此他们是否有机会将项目发送给您,或者您是否可以给我发电子邮件,以便我可以更好地理解您的意思,也非常感谢您的所有帮助,并且一定会从中学习AppCoda 很快!以上是关于如何将集合视图数据传递给新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?
通过TableView将XML数组数据传递给CollectionView
如何以编程方式在视图控制器之间传递数据?我想将我的UITextfield数据传递给另一个视图控制器[重复]