tableView:willDisplayHeaderView:inSection:在ios6.1运行时未被调用



我在stackoverflow上没有找到类似的问题,所以我将发布我自己的问题(如果有什么不理解的请告诉我):

问题:

我在自定义UITableViewController中使用一个通用的索引tableView与a - z(如contacts.app)的节头。我重写tableView:viewForHeaderInSection:来提供我自己的section-header视图。

当用户向上或向下滚动表时,我需要听取在tableView的顶部或底部出现/消失的部分标题(相应地改变一些自定义视图)。

我重写了这些方法(从iOS 6.0开始可用),它们正是我需要的:

  1. tableView:didEndDisplayingHeaderView:forSection:

  2. 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;
        }
    }

可能对有同样问题的人有帮助:)

相关内容

  • 没有找到相关文章

最新更新