tableView:willDisplayHeaderView:inSection:在运行iOS 6.1时未调用

时间:2013-06-10 14:49:51

标签: iphone objective-c ios6 uitableview indexed

我没有在stackoverflow上找到相同的问题,所以我会在这个问题上发表我自己的问题(请告诉我是否有些事情是不可理解的):

问题:

我在自定义tableView中使用常见的索引UITableViewController,其中包含来自A-Z的部分标题(如contacts.app中的部分)。 我重写tableView:viewForHeaderInSection:以提供我自己的节标题视图。

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

我覆盖了这些完全符合我需要的方法(自iOS 6.0起可用):

  1. tableView:didEndDisplayingHeaderView:forSection:

  2. tableView:willDisplayHeaderView:forSection:

  3. 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
    

2 个答案:

答案 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;
        }
    }

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