Subclassed UITableView

时间:2011-09-16 11:55:04

标签: iphone objective-c ios uitableview subclassing

我想要一个UITableView的子类来绘制自定义的Section头。我尝试如下:

#import <UIKit/UIKit.h>
@interface MyTableView : UITableView
@end
@implementation MyTableView
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
  //my drawing code goes here
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
  //returns the height
}
@end

然而,当我使用这个类时,它会绘制正常的标题。我做错了什么?

当我将这些函数直接设置到控制器(没有子类化)时,它可以正常工作。

更新: 我已经有很多使用UITableView的类,我想将它子类化,因为更改编写所需类的类可能更快。如何通过改变课程来改变标题,是否可能?

3 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您继承了UITableView类,而且此方法不是来自UITableView,而是来自UITableViewDelegate

它适用于您的控制器,因为您已将delegate的{​​{1}}属性设置为指向您的控制器,或者您正在使用UITableView,其中会自动设置tableview委托。 (实际上,在您的情况下,使用UITableViewController会更糟糕,因为它已经实现了UITableViewController而不是您的自定义类。

编辑:不幸的是,由于UITableView类中使用delegation pattern来更改其节标题视图,因此实现此类操作并非直截了当

这样做的一种方法是在类中提供这些“helper”方法,然后在每个控制器上实现委托,以便在触发委托方法时正确调用这些方法。

如果这种方法是可以接受的,你甚至应该考虑使用这些方法的类别,而不是将UITableView子类化,这将使代码更清晰。

显然,您可以将UITableView委托设置为您的自定义类,然后为您仍希望向控制器触发的调用创建另一个委托,例如UITableView,然后调用此新的在tableview触发方法时委托方法,但这是迄今为止最糟糕的解决方案

答案 1 :(得分:1)

我不明白为什么要实施TableView而不是MyTableView

@implementation MyTableView

更新:

检查您是否正确设置了该表的dataSourcedelegate属性。

UPDATE2:

您应该从UITableViewController

继承
@interface MyTableView : UITableViewController
@end

答案 2 :(得分:0)

您可以继承UITableViewController,处理viewForHeaderInSection和heightForHeaderInSection,然后使用MyTableViewController作为您希望拥有自定义标头的每个表视图的基类。但是,viewForHeaderInSection需要具有创建UILabel所需的信息或者您将用于显示标题的任何信息,因此您需要在子类中使用一些一致的代码来提供 - 就像一个充满了NSArray的NSArray标题所需的字符串,或者可以从viewForHeaderInSection调用的方法。