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

时间:2015-06-28 02:56:09

标签: 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 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中的segue以显示DetailViewController。 请帮忙!

1 个答案:

答案 0 :(得分:7)

您可以通过多种方式实现这一目标。例如,

  • Datasource的属性
  • 中保留ViewController的引用
  • 通过关闭
  • 委托模式

但是使用委托模式是我的首选。

首先,您需要创建DatasourceDelegate协议。

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

其次,在Datasource类中,您将拥有一个DatasourceDelegate对象。喜欢这个

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

并在tableView(_ :didSelectRowAtIndexPath:)。它将调用DatasourceDelegate函数。喜欢这个

extension Datasource: UITableViewDelegate{

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

最后,在您的分离ViewController类中,您将视图控制器设置为符合DatasourceDelegate协议。喜欢这个

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)
    }
}