如何在视图控制器之外设置数据源和委托

Posted

技术标签:

【中文标题】如何在视图控制器之外设置数据源和委托【英文标题】:How to set datasource and delegate Outside of View Controller 【发布时间】:2015-03-13 08:06:40 【问题描述】:

这听起来像是一个奇怪的问题,但我正在尝试实现 BEMSimpleLineGraph 库来生成一些我放在 UITableView 中的图表。我的问题是我如何引用外部数据源和委托以在每个单元格中放置不同的图形(BEMSimpleLineGraph 是在 UITableView 和 UICollectionView 之后建模的)。我目前有这样的事情:

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

    let cell: FlightsDetailCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as FlightsDetailCell

    cell.userInteractionEnabled = false

    if indexPath.section == 0 

        cell.graphView.delegate = GroundspeedData()
        cell.graphView.dataSource = GroundspeedData()
        return cell

    
    if indexPath.section == 1 

        cell.graphView.delegate = self
        cell.graphView.dataSource = self
        return cell

    
    return cell

我的第 1 部分的数据源和委托在此下方正确设置,GroundspeedData 类如下所示:

class GroundspeedData: UIViewController, BEMSimpleLineGraphDelegate, BEMSimpleLineGraphDataSource 

func lineGraph(graph: BEMSimpleLineGraphView!, valueForPointAtIndex index: Int) -> CGFloat 
    let data = [1.0,2.0,3.0,2.0,0.0]
    return CGFloat(data[index])
    

func numberOfPointsInLineGraph(graph: BEMSimpleLineGraphView!) -> Int 
    return 5
    

由于某种原因,当我运行该应用程序时,Xcode 报告它找不到第 0 节的数据源,特别是“数据源不包含数据。”。我应该如何引用这个备用数据源?

【问题讨论】:

【参考方案1】:
    cell.graphView.delegate = GroundspeedData()
    cell.graphView.dataSource = GroundspeedData()

一个问题是:委托和数据源是弱引用。这意味着他们不会保留他们设定的内容。因此,这些行中的每一行都会创建一个 GroundspeedData 对象,该对象会立即消失在一阵烟雾中。您需要做的是制作一个 GroundspeedData 对象并保留它,然后将图形视图的委托和数据源指向它

另一个问题是:您打算创建一个 GroundspeedData 对象还是使用视图控制器层次结构中已经存在的对象?因为GroundspeedData() 创建了一个 - 没有视图和数据。您可能的意思是使用对现有的引用。

【讨论】:

如果,如我所料,您的问题是您没有掌握 实例化 类和获取对 现有 的引用之间的区别该类的实例,我的新 Swift 教程有一个关于这个问题的部分:apeth.com/swiftBook/ch04.html#_instance_references 我有上面显示的 GroundspeedData 类,我试图让我的 graphView(针对特定部分)从该类中获取它的委托和数据源。那有意义吗?数据已经在类中,我只需要访问它。 不,@user3185748,没有“数据已经在类中”这样的东西。数据位于类的 instance 中。这就是你没有掌握的整个概念。 如果问题更基础,并且您不了解类和实例,那么您应该在我的教程中更早开始,就像在开头一样:apeth.com/swiftBook/ch01.html#_instances 我只是出去玩一个小时,但我回来后会看看你建议的章节,看看是否有帮助。

以上是关于如何在视图控制器之外设置数据源和委托的主要内容,如果未能解决你的问题,请参考以下文章

如何设置滚动视图委托? [关闭]

视图控制器的设置委托问题?

如何将我的视图控制器设置为它自己的委托?

设置数据源和委托使 UITableView 的应用程序崩溃

将容器控制器(根视图控制器)设置为 UITabBarController 中视图控制器的委托

这个设置委托方法是如何工作的?