我在stackoverflow上没有找到类似的问题,所以我将发布我自己的问题(如果有什么不理解的请告诉我):
问题:
我在自定义UITableViewController
中使用一个通用的索引tableView
与a - z(如contacts.app)的节头。我重写tableView:viewForHeaderInSection:
来提供我自己的section-header视图。
当用户向上或向下滚动表时,我需要听取在tableView的顶部或底部出现/消失的部分标题(相应地改变一些自定义视图)。
我重写了这些方法(从iOS 6.0开始可用),它们正是我需要的:
-
tableView:didEndDisplayingHeaderView:forSection:
-
tableView:willDisplayHeaderView:forSection:
2。在上下滚动tableView时永远不会被调用,而方法1每次从屏幕上消失时都会被调用。
我不知道为什么一个被调用而另一个没有。这是苹果的bug还是我做错了什么?
相似的问题:
我在这里发现了一个类似的问题如何调用一个方法"willDisplayFooterView"在表视图自定义?其中一个答案是:
它们只会在ios6.0或更高版本下被调用,并且只有当你也实现了其他header/footer title/view方法时才会被调用。如果提供的是页眉或页脚,则不需要将其命名为
。
我不确定我是否理解正确的答案,但如果是这样的话,在子类中实现哪些方法似乎很重要。
代码:
我只发布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
我想我现在明白了。
上面提到的类似问题已经给出了答案,而我没有答对:
[…如果要提供页眉或页脚,则不需要将其命名为
。
(这里的"these"可能是指我上面覆盖的两个方法)
因为我提供了自己的section头,而不是方法tableView:willDisplayHeaderView:forSection:
,另一个重写方法:tableView:viewForHeaderInSection:
在每次section头进入屏幕时被调用。
所以最后我将在最后提到的方法中做我需要的配置。
出于某种原因,在我的情况下,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;
}
}
可能对有同样问题的人有帮助:)