Xcode 如何将集合视图数据传递给新的视图控制器
我会尽量说得具体一些 我试图实现的是一个视图控制器,其中包含一个集合视图,当用户单击集合视图单元格的,然后,它将用户发送到另一个视图控制器,该控制器具有另一个集合视图,但第二个集合视图中显示的项目将根据用户先前点击的集合视图单元格而变化。我也在使用CoreData来实现这一点。对于CoreData,任务是一个实体,具有名称等属性。我是否必须更改此属性,或者在两个集合视图之间建立关系 我之所以想这样做,是因为我正在为iOS创建一个生产力应用程序,第一个具有集合视图的视图控制器将是用户可以在这些项目中创建项目的地方,这些项目将显示在集合视图中,然后,用户可以点击其中一个单元格并转到下一个视图控制器,开始创建特定于该项目的任务 如何将任务存储在特定的集合视图单元格中,并让用户在其他项目中创建不同的任务。这有点像神童。如果有人对我想做的事感到困惑,我可以多说几句 这是我的一个视图控制器,其中来自“创建项目视图控制器”的数据通过CoreData发送到,并显示在集合视图中,希望有帮助:Xcode 如何将集合视图数据传递给新的视图控制器,xcode,core-data,swift3,uicollectionview,Xcode,Core Data,Swift3,Uicollectionview,我会尽量说得具体一些 我试图实现的是一个视图控制器,其中包含一个集合视图,当用户单击集合视图单元格的,然后,它将用户发送到另一个视图控制器,该控制器具有另一个集合视图,但第二个集合视图中显示的项目将根据用户先前点击的集合视图单元格而变化。我也在使用CoreData来实现这一点。对于CoreData,任务是一个实体,具有名称等属性。我是否必须更改此属性,或者在两个集合视图之间建立关系 我之所以想这样做,是因为我正在为iOS创建一个生产力应用程序,第一个具有集合视图的视图控制器将是用户可以在这些项目
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")
}
}
如果我猜对了,在单击第一个集合视图上的单元格后,您希望转到另一个集合视图,在该视图中,您将根据所选单元格显示数据 为了实现这一点,只需在第一个视图控制器中添加
collectionView(\ucollectionview:,didSelectItemAt indexath:)
和prepare(for segue:,sender:)
函数
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "YourIdentifier"{
let destinationViewController = segue.destination as! SecondViewController
destinationViewController.id = id
}
}
在collectionView(\collectionView:,didSelectItemAt indexath:)
函数中,通过确定所选单元格获取所选任务的id,然后将此id传递给prepare(对于segue:,sender:)函数中的第二个视图控制器
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! MyCollectionViewCell
id = cell.labelTe?.text
}
或
然后在prepare(对于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 = ""
只需确保两个变量的类型相同即可 可能应该发布与此相关的代码。另外,我认为您想将数据从单元格传递到详细视图控制器,对吗?@CalebKleveter发布了我的主视图控制器代码,我还想将数据从一个单元格传递到另一个视图控制器中的另一个集合视图单元格,这样,如果按下该特定单元格,它会显示某些项目,如果用户按下另一个单元格,则会显示不同的集合视图单元格。非常感谢您的回答,也请您告诉我您在两个ViewController中创建“var id”是什么意思,我对Xcode非常陌生,所以不确定如何获取数据等。再次感谢!非常感谢编辑,我现在声明了这两个变量,并添加了segue和didSelect,但是我不确定如何使用id从CoreData获取数据。我也不确定如何保存任务,以便它保存与一个集合视图单元格而不是另一个单元格相关的内容。如果你能帮我完成最后一步,那就太好了,我的电子邮件是richardwesselsofficial@gmail.com如果你能给我发封电子邮件,我就可以给你看我的项目,这个问题就简单多了。谢谢!是的,我一直在关注YouTube教程,最近一直在研究prepareForSegue函数,但仍然不太确定如何使集合视图单元格仅显示已保存到其中的任务,并研究了如何使用标识符保存,但几乎没有成功。我对Xcode还是非常陌生,对许多概念也不太清楚。很抱歉拖出这个问题,但如果您可以给我发电子邮件或给出一个使用id显示CoreData的示例。谢谢!尝试从appcoda学习。他们提供相当不错的教程和书籍,你可以从他们那里购买。他们涵盖了从上到下的一切,并不断更新新的操作系统。他们可能真的帮了你。谢谢你的消息来源,问题是,我正在开发一个待办事项列表应用程序,它需要在3月1日之前准备好分发,而这个问题与CoreData的另一个集合视图关联的集合视图严重减慢了开发速度,所以他们有没有可能我将项目发送给你,或者你可以发电子邮件给我,这样我就可以得到更好的结果理解你的意思,也非常感谢你的帮助,我们一定会很快从AppCoda学习!