如何从另一个swift文件传输viewTable的数据源?

时间:2015-06-25 21:59:31

标签: ios swift uitableview

我知道这可能听起来很愚蠢,我已经尝试了几个小时,但无法弄清楚如何。如何在此方案中将标题加载到tableView?

我知道有一种简单的方法可以在ViewController.swift文件中声明一个数组,并使委托和datasource = self像这样:

self.drugsTableView.dataSource = self
self.drugsTableView.delegate = self

但是在这种情况下我想从另一个swift文件中获取tableView数据源,以下是我的方案:

在项目导航器中,我有以下文件:

1。 ViewController.swift

2。 DrugsLibrary.swift

第3。 DrugList.swift

  

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var drugsTableView: UITableView!

var drugList: DrugsLibraryStruct?

override func viewDidLoad() {
    super.viewDidLoad()
    self.drugsTableView.dataSource = self
    self.drugsTableView.delegate = self
    self.navigationItem.title = "Titles"

}


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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier:"test")
    return cell
}
  

DrugsLibrary.swift

import Foundation

struct DrugsLibraryStruct {

let drugsLibraryDictionary = [
    [
        "name": "Drug A",
        "subtitle": "Drug A subtitle!",
        "icon": "drugA.pdf"

    ],
    [
        "name": "Drug B",
        "subtitle": "Drug B subtitle",
        "icon": "drugb.pdf"
    ]
]

}

  

DrugList.swift

import Foundation
import UIKit

struct DrugListStruct {

var name: String?
var subtitle: String?
var icon: UIImage?

init(index: Int) {

    let drugsLibrary = DrugsLibraryStruct().drugsLibraryDictionary
    let drugListDictionary = drugsLibrary[index]

    name = drugListDictionary["name"] as String!
    subtitle = drugListDictionary["subtitle"] as String!

    let iconName = drugListDictionary["icon"] as String!
    icon = UIImage(named: iconName)
}

}

以下是Dropbox上的source code

我非常感谢您的提示或帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

只需创建另一个文件。

class DataSource: NSObject {

    lazy var list ... //your data here
}

extension DataSource: UITableViewDataSource {
    //method here
}

extension DataSource: UITableViewDelegate {
    //method here
}

并在你的ViewController中:

let dataSource = DataSource()

drugsTableView.dataSource = dataSource
drugsTableView.delegate = dataSource

支持自己,使用UITableViewDelegate时会很棘手:)

由于您是新手,我会更详细地更新我的答案。

lazy var list是您的dataArray,您可以删除lazy部分。我把它留在那里是因为我没有立即显示我的表格,所以在需要之前我不会查询它。

在您的情况下,只需使用:var myArray = ...

extension DataSource: UITableViewDataSource {
    func tableView - numberOfRowsInsection (your method above)
    func tableView - cellForRowAtIndexPath (your method above)
    //these methods are required, since they're needed for display data on table
}

extension DataSource: UITableViewDelegate {
    //methods which will be called when you interact with the table
    func tableView - didSelectRowAtIndexPath ...
}

我这里没有Xcode,所以请自行查找这些方法:)

如果你想使用UITableViewDelegate,你必须创建一个协议,在这些UITableViewDelegate的方法中调用它并将它们委托给你的控制器:)

答案 1 :(得分:1)

我终于让它工作了,我使用你的代码作为提示,但我不得不使用不同的代码。这是代码:

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
}

}