![](/img/trans.png)
[英]Not able to jump from tableViewCell to another viewController using segue
[英]Properly segue from collectionview inside tableviewcell to another viewcontroller
我正在尝试将(传递数据)从 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()
}
}
我正在尝试使用的视图控制器:
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 目前是空的。
像目前所说的那样,您的问题有点难以回答,因为尚不清楚您在做什么。 例如,不清楚您是否使用故事板。
如果是,那么您可能想在故事板中定义您的转场,并让 UIKit 为您调用它们。 本文档提供了希望对您有所帮助的概述。 特别是,您不必手动执行 segue,因为一旦您在 Storyboard 中设置了它(重点是我的),UIKit 就会为您执行此操作:
您不需要以编程方式触发 segue。 在运行时,UIKit 加载与视图控制器关联的 segue 并将它们连接到相应的元素。 当用户与元素交互时,UIKit 加载适当的视图控制器,通知您的应用程序即将发生转场,并执行转换。 您可以使用 UIKit 发送的通知将数据传递给新的视图控制器,或者完全防止 segue 发生。
在图 9-4 中,您将看到 segue 进程的事件流。 特别要注意的是,如果您在源视图控制器中为 segue 覆盖prepareForSegue:sender:
那么这是您准备数据并将其发送到目标视图控制器的机会(视图设置目标视图控制器的representedObject
对象,或通过为目标视图控制器类定义的自定义 setter 方法)。 该图下方的描述文字说明了这一点:
源视图控制器的
prepareForSegue:sender:
方法允许您将数据从源视图控制器传递到目标视图控制器。 传递给该方法的 UIStoryboardSegue 对象包含对目标视图控制器的引用以及其他与 segue 相关的信息。
如果您不使用故事板,那么您实际上是在手动做同样的事情。 您分配要显示的 UIViewController 子类以响应单元格项中的触摸,然后将其representedObject
设置为它应该显示的数据(或调用由该类定义的自定义方法并传入视图控制器需要的数据显示),然后显示视图控制器。 要手动呈现它,您需要阅读 Apple 的Presenting a View Controller文档。 特别是:
呈现一个视图控制器
有几种方法可以启动视图控制器的呈现:
使用 segue 自动呈现视图控制器。 segue 使用您在 Interface Builder 中指定的信息实例化并呈现视图控制器。 有关如何配置 Segue 的更多信息,请参阅使用 Segue 。 使用
showViewController:sender:
或showDetailViewController:sender:
方法来显示视图控制器。 在自定义视图控制器中,您可以将这些方法的行为更改为更适合您的视图控制器的行为。 调用presentViewController:animated:completion:
方法以模态呈现视图控制器。
希望这足以让你继续前进。 如果没有,也许可以用更多的上下文来澄清您的问题,我们会再试一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.