将数据源分离到Swift中的另一个类,然后处理数据更改

时间:2016-05-20 11:14:40

标签: ios swift uitableview design-patterns datasource

我正在尝试按照此处显示的模式:https://www.objc.io/issues/1-view-controllers/lighter-view-controllers/并在此处查看了此问题:Separating Data Source to another class in Swift

我有以下代码:

class ApplicationsViewController: UIViewController {

    @IBOutlet var tableView: UITableView!
    let tableViewDataSource = ApplicationTableDataSource()

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        //fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {
        setupView()
    }

    func setupView() {
        tableView.dataSource = tableViewDataSource
    }
}

然而,我并不完全了解将数据传递/传递到数据源的最佳方式是什么。

举一个例子,让我们想象一下应用程序启动,我们的数据源中没有数据。在我们的ApplicationTableDataSource类中,我们有一个名为setApplicationData的方法。在viewController中,我们单击一个添加按钮,为作业添加一个新的应用程序:

func buttonPressed() {
    let data = NSData()        

    //Here we want to add the data to array in data source

    // We can't do the following as tableView.dataSource doesn't know about the setApplicationData method:
    tableView.dataSource.setApplicationData(data)

    // We could do: 
    tableViewDataSource.setApplicationData(data)
}

我不确定这是否是更新数据源的最佳方式。

有没有更好的方法来处理更新数据源?

1 个答案:

答案 0 :(得分:0)

如果您使用核心数据并在表格视图中显示此信息,我强烈建议您查看NSFetchedResultsController

我第一次使用它时使用this guide并发现它是一个非常有效的解决方案。

当用户将新信息添加到与您显示数据的查询相匹配的核心数据表中时,tableview将自动为您插入行。

如果您想保持简单并使用数组,您只需将新数据附加到数组中,然后在tableView或reloadData上调用insertRowsAtIndexPaths。这个SO answer将帮助您实现这一目标。

只是为了让您了解如何将另一个文件用于tableView数据源,请参阅下文:

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var dataSource = TBDataSource()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.dataSource = dataSource
        tableView.delegate = self

        dataSource.insertData("Data Row 1")
        dataSource.insertData("Data Row 2")
        dataSource.insertData("Data Row 3")
        dataSource.insertData("Data Row 4")
    }
}

class TBDataSource: NSObject, UITableViewDataSource  {

    var data = [String]()

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

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

        let cell = tableView.dequeueReusableCellWithIdentifier("cell")!
        cell.textLabel?.text = data[indexPath.row]
        return cell

    }

    func insertData(str:String) {
        data.append(str)
    }
}

这几乎是从外部类向表提供数据的最小设置。如果你在初始加载后添加数据,你需要调用reloadData或insertRowAtSection,如果你没有使用NSFectchedResultsController