Ios 如果数据源来自另一个swift文件,如何从tableView激活segue?

Ios 如果数据源来自另一个swift文件,如何从tableView激活segue?,ios,swift,uitableview,datasource,segue,Ios,Swift,Uitableview,Datasource,Segue,我的ViewController中有一个tableView,该表的数据源来自另一个swift文件:datasource.swift。这是数据源文件的代码: import Foundation import UIKit class Datasource: NSData, UITableViewDataSource, UITableViewDelegate { let itemsArray = ["Item 1","Item 2","Item 3","Item 4"] func tableVi

我的ViewController中有一个tableView,该表的数据源来自另一个swift文件:datasource.swift。这是数据源文件的代码:

import Foundation
import UIKit
class Datasource: NSData, UITableViewDataSource, UITableViewDelegate {

let itemsArray = ["Item 1","Item 2","Item 3","Item 4"]


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return itemsArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier:"test")
    cell.textLabel!.text = self.itemsArray[indexPath.row]

    return cell
}
}
我尝试添加以下代码:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    self.performSegueWithIdentifier("mainToDetail", sender: self)

}
但它给了我一个错误,我也尝试了这个代码,但效果不好:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    ViewController.performSegueWithIdentifier("mainToDetail", sender: ViewController)

}
我想添加一个功能,当我单击表中的一行时,会激活ViewController中的一个序列以显示DetailViewController。
请帮忙

您可以通过多种方式实现这一点。比如说,

  • 数据源的属性中保留ViewController的引用
  • 过关
  • 委托模式
但我更喜欢使用委托模式


首先,您需要创建
DatasourceDelegate
协议

protocol DatasourceDelegate: class{
    func didSelectGoToMainMenu( datasource datasource: Datasource)
}

其次,在
Datasource
类中,您将有一个
DatasourceDelegate
对象。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}
并在
表视图中(uxSelectRowatineXpath:)
。它将调用
DatasourceDelegate
函数。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}

最后,在单独的ViewController类中,将视图控制器设置为符合
DatasourceDelegate
协议。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}

您可以通过多种方式实现这一点。比如说,

  • 数据源的属性中保留ViewController的引用
  • 过关
  • 委托模式
但我更喜欢使用委托模式


首先,您需要创建
DatasourceDelegate
协议

protocol DatasourceDelegate: class{
    func didSelectGoToMainMenu( datasource datasource: Datasource)
}

其次,在
Datasource
类中,您将有一个
DatasourceDelegate
对象。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}
并在
表视图中(uxSelectRowatineXpath:)
。它将调用
DatasourceDelegate
函数。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}

最后,在单独的ViewController类中,将视图控制器设置为符合
DatasourceDelegate
协议。像这样

class Datasource: NSObject,UITableViewDataSource,UITableViewDelegate{
    //...
    weak var delegate: DatasourceDelegate?
    //...
}
extension Datasource: UITableViewDelegate{

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        delegate?.didSelectGoToMainMenu(datasource: self)
    }
}
class myViewController: UIViewController, DatasourceDelegate{

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        ////////

        let dataSource = Datasource()
        dataSource.delegate = self

        tableView.dataSource = dataSource
        tableView.delegate = dataSource

    }

    // this function will be called when someone select a row
    func didSelectGoToMainMenu(datasource datasource: Datasource) {
        performSegueWithIdentifier("mainToDetail", sender: self)
    }
}

我不知道该如何感谢你,我的朋友,这很有效!非常感谢。如果可以,还有一个问题,您能告诉我在这种情况下如何实现prepareforsegue方法吗?我一直在努力,但不知道该怎么做。我对使用协议非常陌生(我第一次使用它),我认为您可以在myViewController中覆盖prepareForSegue“prepareForSegue”在myViewController的“didSelectGoToMainMenu”中执行segue时将自动调用。我不知道如何感谢你,我的朋友,这非常有效!非常感谢。如果可以,还有一个问题,您能告诉我在这种情况下如何实现prepareforsegue方法吗?我一直在努力,但不知道该怎么做。我对使用协议非常陌生(我第一次使用它),我认为您可以在myViewController中覆盖prepareForSegue在myViewController的“didSelectGoToMainMenu”中执行segue时,将自动调用“prepareForSegue”。