0

我有一个 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?

谢谢!

4

2 回答 2

0

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

于 2015-11-16T23:14:08.820 回答
0

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

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

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

我认为一种更简洁、风险更低的方法是创建一个符合 UITableviewDataSource 协议的类,该协议将框架用户现有 UITableviewDataSource 的实例作为 init 参数,并一直环绕它,通过和/或当你需要它的行为时修改对它的调用,当你不需要它时将它隐藏起来。然后你使用你的包装类作为 tableview 上的委托。

你怎么看?

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

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

于 2015-11-13T23:06:12.467 回答