我试图从一个tableviewcell内部的collectionview隔离(传递数据)到另一个viewcontroller。我尝试使用didselect委托,但坚持如何正确传递数据。看来我有点不知所措,但是我想学习正确的方法。下面是我的代码:
我的主视图控制器:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segue" {
let vc = segue.destination as! DetailViewController
vc.text = "Hello World"
}
}
func segue() {
self.performSegue(withIdentifier: "segue", sender: self)
}
}
我的表格视图:
import UIKit
class MainTableView: UITableView, UITableViewDelegate, UITableViewDataSource {
override func awakeFromNib() {
self.delegate = self
self.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MainTableViewCell", for: indexPath) as! MainTableViewCell
return cell
}
}
我的收藏集视图:
import UIKit
class MoviesCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource {
override func awakeFromNib() {
self.delegate = self
self.dataSource = self
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MoviesCollectionViewCell", for: indexPath) as! MoviesCollectionViewCell
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = ViewController()
vc.segue()
}
}
我要选择的View控制器:
class DetailViewController: UIViewController {
@IBOutlet weak var label: UILabel!
var text: String?
override func viewDidLoad() {
super.viewDidLoad()
self.label.text = text
// Do any additional setup after loading the view.
}
}
我的tableviewcell和collectionviewcell目前为空。
答案 0 :(得分:0)
您的问题目前很难回答,因为目前尚不清楚您在做什么。例如,不清楚是否使用情节提要。
如果是,那么您可能想在情节提要中定义您的脚本,并让UIKit为您调用它们。 documentation提供了概述,希望对您有所帮助。特别是,您不必手动执行segue,因为一旦在Storyboard(重点是我的)中设置了UIKit,UIKit就会为您完成:
您不需要以编程方式触发搜寻。在运行时,UIKit 加载与视图控制器关联的segue并将其连接 到相应的元素。当用户与 元素,UIKit加载适当的视图控制器,通知您 即将发生segue的app,并执行过渡。 您 可以使用UIKit发送的通知将数据传递到新视图 。或者完全阻止segue发生。
在图9-4中,您将看到segue流程的事件流。特别要注意的是,如果您在源视图控制器中为segue覆盖了prepareForSegue:sender:
,那么这就是您准备数据并将其发送到目标视图控制器的机会(任何为目标设置representedObject
的视图视图控制器,或通过为目标视图控制器类定义的自定义setter方法)。该图下面的描述文字清楚地表明了这一点:
源视图控制器的
prepareForSegue:sender:
方法允许 您将数据从源视图控制器传递到目标视图 控制器。 传递给方法的UIStoryboardSegue对象包含 对目标视图控制器的引用以及其他 与搜寻有关的资讯。
如果您不使用情节提要,那么您实际上是在手工做同样的事情。您可以分配要显示的UIViewController子类,以响应单元格项目中的触摸,然后将其representedObject
设置为其应显示的数据(或调用该类定义的自定义方法,然后将数据传递给视图控制器需要显示),然后显示视图控制器。要手动显示它,您需要阅读Apple的Presenting a View Controller文档。特别是:
呈现视图控制器
有几种方法可以启动视图控制器的显示:
使用segue自动显示视图控制器。塞格 使用以下信息实例化并呈现视图控制器 您在Interface Builder中指定的。有关如何的更多信息 配置脚本,请参阅Using Segues。使用
showViewController:sender:
或showDetailViewController:sender:
方法显示视图 控制器。在自定义视图控制器中,您可以更改 这些方法使某些东西更适合您的视图控制器。 调用presentViewController:animated:completion:
方法进行演示 视图控制器为模态。
希望这足以让您前进。如果不是,请在更多上下文中澄清您的问题,我们将重试。