繁体   English   中英

正确地从 tableviewcell 内的 collectionview 转到另一个 viewcontroller

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM