当前位置:  开发笔记 > IOS > 正文

如何在UITableView中使用外部数据源

如何解决《如何在UITableView中使用外部数据源》经验,为你挑选了1个好方法。

我有一个UIViewController我嵌入了一个UITableView.如果为我的ViewController类添加了一个插座.

因为我不想ViewController太重,所以我想把UITableViewDataSource协议和UITableViewDelegate协议的方法放到不同的类中.

所以我创建了一个TableViewDataSource.swift和一个TableViewDelegate类:

class TableViewDelegate : NSObject, UITableViewDelegate {
    //custom code here if required
}

class TableViewDataSource : NSObject, UITableViewDataSource {
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

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

        let cellIdentifier = "MyCellIdentifier"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)

        cell.textLabel?.text = "left text"
        cell.detailTextLabel?.text = "right text"

        return cell


    }


}

class ViewController: UIViewController {

    @IBOutlet var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = TableViewDataSource()
        tableView.delegate = TableViewDelegate()

        tableView.setNeedsDisplay()

        // Do any additional setup after loading the view, typically from a nib.
    }
}

在我的Storyboard中,我在tableView中创建了一个原型单元格,标识符为"MyCellIdentifier".我使用此标识符在我的TableViewDataSource方法中创建一个单元格.

但是,如果我运行应用程序,我只会看到一个空的tableView.即使我已经在ViewController的viewDidLoad方法中设置了这些方法,也不会调用这些方法.我还尝试通过调用setNeedsDisplay来强制执行tableView重绘.这也没有效果.

在此输入图像描述



1> TwoStraws..:

你走在正确的轨道上,我相信你的问题很容易解决.看这里:

tableView.dataSource = TableViewDataSource()
tableView.delegate = TableViewDelegate()

这创造了一个新的TableViewDataSource和新的TableViewDelegate,dataSourcedelegate分别分配给他们.以下是这些属性UITableView:

weak public var dataSource: UITableViewDataSource?
weak public var delegate: UITableViewDelegate?

请注意weak一下?你正在创建它们并将它们分配给一个弱的属性,所以它们会很快被抛弃.

您的解决方案是为视图控制器中的这两个新对象创建属性,然后在其中创建这些属性viewDidLoad()并将其发送到表视图中.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有