从tableviewcell内的collectionview正确地隔离到另一个ViewController

时间:2018-11-21 22:14:27

标签: ios swift cocoa uikit

我试图从一个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目前为空。

1 个答案:

答案 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:方法进行演示   视图控制器为模态。

希望这足以让您前进。如果不是,请在更多上下文中澄清您的问题,我们将重试。