如何从数据源来自另一个 swift 文件的 tableView 激活 segue?
How do I activate a segue from a tableView where the datasource is from another swift file?
我的 ViewController 中有一个 table 视图,此 table 的数据源来自另一个 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)
}
我想添加一个功能,当我点击 table 中的一行时,来自 ViewController 的一个 segue 被激活以显示细节 ViewController。
请帮忙!
您可以通过多种方式实现这一点。例如,
- 在
Datasource
的属性 中引用ViewController
- 通过闭包
- 委托模式
但我更喜欢使用委托模式。
首先,您需要创建 DatasourceDelegate
协议。
protocol DatasourceDelegate: class{
func didSelectGoToMainMenu( datasource datasource: Datasource)
}
其次,在Datasource
class中,您将有一个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 class 中,您将视图控制器设置为符合 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)
}
}
我的 ViewController 中有一个 table 视图,此 table 的数据源来自另一个 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)
}
我想添加一个功能,当我点击 table 中的一行时,来自 ViewController 的一个 segue 被激活以显示细节 ViewController。 请帮忙!
您可以通过多种方式实现这一点。例如,
- 在
Datasource
的属性 中引用ViewController
- 通过闭包
- 委托模式
但我更喜欢使用委托模式。
首先,您需要创建 DatasourceDelegate
协议。
protocol DatasourceDelegate: class{
func didSelectGoToMainMenu( datasource datasource: Datasource)
}
其次,在Datasource
class中,您将有一个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 class 中,您将视图控制器设置为符合 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)
}
}