使用NSURLSession的结果填充UITableView

时间:2015-02-24 06:51:54

标签: ios uitableview swift ios8 single-responsibility-principle

所以我试图使用api调用的结果填充tableView。我有一种感觉,这是一些奇怪的建筑事物,我不知道(后端网络开发/游戏开发),我不能为我的生活想出这一点。

我有几个文件在这个舞蹈中互动:

我的DashboardViewController.swift负责致电StatusListViewController.swift

它通过StatusHelper.swift执行此操作,其目的是制作和处理REST调用和JSON反序列化。

我在StatusListViewController.swift中有一个tableview,它有一个委托和一个数据源,每个都在不同的文件中(对于干净的代码)。

StatusHelper方法调用结束时,我从信息中心致电presentViewControllerStatusList

以下是文件中的相关摘录:

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反序列化中的链可选解包)。

0 个答案:

没有答案