Swift分离UITableViewDataSource

时间:2015-10-26 17:33:10

标签: ios swift uitableview model-view-controller

我的项目中有4个文件:

  • myTableViewController.swift
  • myTableViewDataSource.swift
  • myCustomCell.swift
  • myCustomCell.xib

这是我实施的内容:

myTableViewController.swift:

import UIKit

class myTableViewController: UIViewController {

    let cellIdentifier: String = "myCell"// set same id in storyboard as well

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func setup(){

        let myDataSource = myTableViewDataSource.init(str: "init!")
        tableView.registerNib(UINib(nibName: "myCustomCell", bundle: nil), forCellReuseIdentifier: "myCell")
        tableView.dataSource = myDataSource
    }

myTableViewDataSource.swift:

import UIKit

class myTableViewDataSource: NSObject, UITableViewDataSource, UITableViewDelegate {

    init(str:String) {
        print(str)
    }

    // MARK: UITableViewDataSource
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        print("section")
        return 3
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("row")
        return 5
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! myCustomCell
        print("where's my cell")
        return cell;
    }
}

我试图做的只是让dataSource成为另一个类,并将它的实例变量分配给我的tableView。

更新

根据@Rajan Maheshwari的说法

tableview.reloadData()底部添加setup()获得了正确的部分/行号, 但仍然没有打印"where's my cell" ......因为cellForRowAtIndexPath从未执行过。

我在这里可能遇到的问题是什么?

2 个答案:

答案 0 :(得分:2)

这是因为您的DataModel是本地变量。将其移至班级。 e.g:

class myTableViewController: UIViewController {
  let myDataSource: myTableViewDataSource
...
  func setup() {
    myDataSource =
...

这种方法称为 MVVM 模式。您可以找到有关此模式的信息here。 此外,您的类应以CamelCase样式命名。因此,请将my...更改为My...

答案 1 :(得分:0)

原因如下:在您的UI设计文件(storyboard或XIB)中,您的表视图有一个条目dataSource。它默认为视图控制器。

如果要更改它,请将数据源类添加为对象。从插座中拖出连接。

如果不这样做,很难覆盖此设置。

enter image description here