【问题标题】:Overriding UITableViewDatasource in a subclass of UITableView在 UITableView 的子类中覆盖 UITableViewDatasource
【发布时间】:2012-09-13 06:41:29
【问题描述】:

我有一个 UITableView 子类,它有时需要提供自己的内部实现来计算节数。因此,有时我需要它从数据源中获取节数,有时我需要忽略数据源并自己计算。

我尝试用类似这样的内容覆盖 UITableView 的 numberOfRowsInSection:(注意这是表格视图的版本,而不是数据源的 tableView:numberOfRowsInSection:):

- (NSInteger)numberOfRowsInSection:(NSInteger)section
    {
    NSInteger numberOfRows = 0 ;
    if( ![self sectionIsCollapsed:section] ) // is the section expanded?
        {
        numberOfRows = [super numberOfRowsInSection:section] ;
        }
    return numberOfRows ;
    }

但是,UITableView 的 -endUpdate 并没有真正调用这个方法,而是直接进入数据源。有没有办法覆盖对数据源的调用,还是我只是 SOL?

谢谢!

【问题讨论】:

  • 为什么不能在dataSource里做呢?
  • 因为这是一个框架类;表视图数据源属于该类的用户。

标签: iphone ios uikit uitableview


【解决方案1】:

您的问题与我正在处理的事情有些相关。
如果我理解正确,您想在自定义 UITableView 实现中覆盖 UITableviewDataSource 的一些方法,而不是其他方法。

在您的情况下,您要求 UITableView 成为它自己的数据源。也许您可以在适当的时候在嵌入式数据源和“真实”数据源之间来回切换?

tableview、datasource、delegate之间没有继承关系。表格视图只有指向其他两个的指针。我能看到这个工作的唯一方法是,如果你在你的 tableview 中实现完整的 UITableviewDataSource 协议(坦率地说闻起来很糟糕),然后将委托指针打乱,这似乎有风险。

我认为一种更简洁且风险更低的方法是创建一个符合 UITableviewDataSource 协议的 class,它将框架用户现有 UITableviewDataSource 的 instance 作为一个 init 参数,并一直包裹它,当你需要它的行为时传递和/或修改对它的调用,并在你不需要它时将它隐藏在黑暗中。 然后你使用你的包装类作为 tableview 上的委托。

你怎么看?

我不记得这个设计模式的名字了,所以我称它为矩阵模式。客户端的数据源/委托在黑暗中,在一个盒子里,并且不知道它不在“真实”世界中。

我怀疑您需要为 UITableviewDataSource 和 UITableViewDelegate 实现类以使这项工作顺利进行。

【讨论】:

    【解决方案2】:

    我在自己的项目中实现了上述方案,效果很好。我已经将委托和数据源完全包装在一个包装对象中,该对象使用现有的委托和数据源进行初始化。 然后我通过我的包装对象操作流入和流出的数据。

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多