我知道这可能听起来很愚蠢,我已经尝试了几个小时,但无法弄清楚如何。如何在此方案中将标题加载到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
我非常感谢您的提示或帮助。
谢谢!
答案 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
}
}