从它派生出子类UITableView



我想要一个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的类了,我想要子类化它因为改变写所需类的类可能会更快。我如何通过改变类来改变标题,这可能吗?

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

它在你的控制器上工作,因为你已经设置了UITableViewdelegate属性指向你的控制器,或者你正在使用UITableViewController,它有表视图委托自动设置。(实际上,在您的情况下,使用UITableViewController更糟糕,因为它已经实现了UITableView而不是您的自定义类)。

编辑:不幸的是,由于UITableView类中使用的委托模式来更改其section头视图,因此实现这种操作并不直接

一种方法是在你的类中提供这些"助手"方法,然后在每个控制器上实现委托,以便在委托方法被触发时正确调用这些方法。

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

显然,你可以将UITableView委托设置为你的自定义类然后创建另一个委托用于你仍然想要触发控制器的调用,比如cellForRowAtIndexPath,然后在tableview触发方法后立即调用这个新委托方法,但这是目前为止最糟糕的解决方案

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

@implementation MyTableView

更新:

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

更新2:

你应该继承UITableViewController:

@interface MyTableView : UITableViewController
@end

你可以子类化UITableViewController,处理viewForHeaderInSection和heightForHeaderInSection,然后使用MyTableViewController作为每个表视图的基类,你想有你的自定义头。然而,viewForHeaderInSection将需要有必要的信息来创建UILabel或任何你将用来显示标题的东西,所以你将需要在你的子类中提供一些一致的代码-像一个NSArray填充你想要的标题字符串,或者一个可以从viewForHeaderInSection调用的方法。

最新更新