我想要一个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的类,我想将它子类化,因为更改编写所需类的类可能更快。如何通过改变课程来改变标题,是否可能?
答案 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
更新:
检查您是否正确设置了该表的dataSource
和delegate
属性。
UPDATE2:
您应该从UITableViewController
@interface MyTableView : UITableViewController
@end
答案 2 :(得分:0)
您可以继承UITableViewController,处理viewForHeaderInSection和heightForHeaderInSection,然后使用MyTableViewController作为您希望拥有自定义标头的每个表视图的基类。但是,viewForHeaderInSection需要具有创建UILabel所需的信息或者您将用于显示标题的任何信息,因此您需要在子类中使用一些一致的代码来提供 - 就像一个充满了NSArray的NSArray标题所需的字符串,或者可以从viewForHeaderInSection调用的方法。