所以我试图使用api调用的结果填充tableView。我有一种感觉,这是一些奇怪的建筑事物,我不知道(后端网络开发/游戏开发),我不能为我的生活想出这一点。
我有几个文件在这个舞蹈中互动:
我的DashboardViewController.swift
负责致电StatusListViewController.swift
。
它通过StatusHelper.swift
执行此操作,其目的是制作和处理REST调用和JSON反序列化。
我在StatusListViewController.swift
中有一个tableview,它有一个委托和一个数据源,每个都在不同的文件中(对于干净的代码)。
在StatusHelper
方法调用结束时,我从信息中心致电presentViewController
到StatusList
。
以下是文件中的相关摘录:
DashboardViewController.swift:
class DashboardViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func showStatuses(sender: UIButton) {
StatusHelper.getStatusesList(ViewController: self)
}
StatusListViewController.swift:
class StatusListViewController: UIViewController {
@IBOutlet weak var statusTable: UITableView!
let cellDescriptor = "Status"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.statusTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellDescriptor)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
StatusHelper.swift:
class StatusHelper {
class func getStatusesList(ViewController vc: UIViewController)
{
// Standard NSURLSession datawithtask call
// Append items to statusList from API results
let sb = UIStoryboard(name: "Main", bundle: nil)
let nvc = sb.instantiateViewControllerWithIdentifier("StatusList") as! StatusListViewController
nvc.statusTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Status")
nvc.statusTable.dataSource = StatusListDataSource(StatusList: statusList)
nvc.statusTable.delegate = StatusListDelegate()
vc.presentViewController(vc, animated: true, completion: nil)
}
StatusListDataSource.swift:
class StatusListDataSource: NSObject, UITableViewDataSource {
var statusList: [Status]
let cellDescriptor = "Status"
init(StatusList sl: [Status])
{
self.statusList = sl
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return self.statusList.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellDescriptor) as! UITableViewCell
cell.textLabel?.text = self.statusList[indexPath.row].label
return cell
}
}
StatusListDelegate.swift:
class StatusListDelegate: NSObject, UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println("Selected \(indexPath.row)")
}
}
因此,当尝试使用statusTable
的{{1}}属性时,它会解开一个nil并抛出异常。我尝试添加UIViewController
但是没有用(因为我已经将它绑定到Interface Builder项目,所以感觉不对。)
所以也许有一种建筑思维方式的改变,但我想最终得到的是:
statusTable = UITableView()
的教程,但我对此并不感兴趣。UIViewController
调用时切换视图(我应该在helper方法中调用presentView?或者我应该加载包含tableview的视图) (在进行其余的api调用之前,我得到了一个例外)NSURLSession
中关闭所有这些的教程,或者用于分离数据源和委托的教程,但没有教程在哪里进行其他api调用并加载另一个具有单独数据源和委托的表视图谢谢!
编辑:我正在使用带有swift 1.2的xcode 6.3 beta(用于我的json反序列化中的链可选解包)。