我没有在stackoverflow上找到相同的问题,所以我会在这个问题上发表我自己的问题(请告诉我是否有些事情是不可理解的):
我在自定义tableView
中使用常见的索引UITableViewController
,其中包含来自A-Z的部分标题(如contacts.app中的部分)。
我重写tableView:viewForHeaderInSection:
以提供我自己的节标题视图。
当用户向上或向下滚动表格时,我需要收听在tableView顶部或底部出现/消失的部分标题(以相应地更改某些自定义视图)。
我覆盖了这些完全符合我需要的方法(自iOS 6.0起可用):
tableView:didEndDisplayingHeaderView:forSection:
tableView:willDisplayHeaderView:forSection:
2。在向上/向下滚动tableView 时永远不会被调用,而每当节标题从屏幕上消失时,方法1就会被调用。
我不知道为什么一个人被召唤而另一个人没有被召唤。这是苹果的错误还是我做错了什么?
我在这里发现了类似的问题 How to call a method “willDisplayFooterView” during Table View cusomization? 答案如下:
只有在您实现其他页眉/页脚标题/视图方法时才会在iOS 6.0或更高版本下调用它们。如果您提供页眉或页脚,则无需调用它们
我不确定我是否理解这个答案,但如果是这样,那么在子类中实现哪些方法似乎很重要。
我只发布了tableViewController
的非空覆盖委托和数据源方法:
tvcA.m
@implementation tvcA
...
#pragma mark - Table view data source
- (NSArray *) sectionIndexTitlesForTableView : (UITableView *) tableView
{
// returns sectionIndexArray with alphabet for example
}
- (UIView *) tableView : (UITableView *) tableView
viewForHeaderInSection : (NSInteger) section
{
MNSectionHeaderView* headerView = [[MNSectionHeaderView alloc] initWithFrame : CGRectMake(0, 0, 260, 22)];
return headerView;
}
- (NSInteger) tableView : (UITableView *) tableView
sectionForSectionIndexTitle : (NSString *) title
atIndex : (NSInteger) index {...}
...
@end
tvcB.h(继承自tvcA)
@interface tvcB : tvcA
...
@end
tvcB.m
@implementation tvcB
...
#pragma mark - Table view data source
- (NSInteger) numberOfSectionsInTableView : (UITableView *) tableView {...}
- (NSInteger) tableView : (UITableView *) tableView
numberOfRowsInSection : (NSInteger) section {...}
- (UITableViewCell*) tableView : (UITableView *) tableView
cellForRowAtIndexPath : (NSIndexPath *) indexPath {...}
- (CGFloat) tableView : (UITableView *) tableView
heightForHeaderInSection : (NSInteger) section {...}
- (UIView *) tableView : (UITableView *) tableView
viewForHeaderInSection : (NSInteger) section {....}
#pragma mark - Table view delegate
- (void) tableView : (UITableView*) tableView
willDisplayHeaderView : (UIView*) view
forSection : (NSInteger) section {
// custom configurations
}
- (void) tableView : (UITableView*) tableView
didEndDisplayingHeaderView : (UIView*) view
forSection : (NSInteger) section {
// custom configurations
}
- (void) tableView : (UITableView *) tableView
didSelectRowAtIndexPath : (NSIndexPath *) indexPath {...}
...
@end
答案 0 :(得分:10)
我想我现在明白了。
上面提到的Similar Question已经给出了答案,我没有做对:
[...]如果您提供页眉或页脚,则无需调用它们
(对于“这些”,他可能意味着我在上面覆盖的两种方法。)
因为我提供了自己的节标题,而不是方法
tableView:willDisplayHeaderView:forSection:
,另一个重要方法:每次分节标题进入屏幕时都会调用tableView:viewForHeaderInSection:
。
所以最后我将在上一个提到的方法中完成我所需的配置。
答案 1 :(得分:0)
出于某些原因,在我的情况下tableView:viewForHeaderInSection:
被调用了所有表的所有部分(我有一个包含大量表的scrollView)。所以你的解决方案不适合我。但是,由于我只需要知道VC弹出时哪个是第一个可见部分,我想出了这个很好的解决方案:
NSInteger firstVisibleSection = 0;
for (int i = 0; i < [_board.swimlanes count]; i++)
{
CGRect sectionRect = [currentTable rectForSection:i];
BOOL containsPoint = CGRectContainsPoint(sectionRect, currentTable.contentOffset);
if (containsPoint)
{
firstVisibleSection = i;
break;
}
}
对于有同样问题的人可能会有帮助:)