user2858870
user2858870

Reputation: 51

UITableView titleForHeaderInSection is not being called

I add a tableview to a view controller then try to change its section header titles in IOS 6.0.

I will be changing header strings every-time a specific function is called so I dont want to deal with (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

I tried to use (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section but when I put a breakpoint I see that its not being called.

in.h file I add UITableViewDelegate,UITableViewDataSource

in.m

-(void)viewDidAppear:(BOOL)animated
{
   //tableview init
    self.meetingList=[[UITableView alloc] initWithFrame:CGRectMake(10, self.ckCal.frame.origin.y + self.ckCal.bounds.size.height+20, 384, 450) style:UITableViewStylePlain];
    [self.meetingList setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    self.meetingList.delegate=self;

    //populate mutablearray for tableview here
    [self eventsInThisMonth:[NSDate date]];

    [self.view addSubview:self.meetingList];
}
-(void)eventsInThisMonth:(NSDate *)date
{

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter  setDateFormat:@"MMMM , yyyy"];
    //self.firstSectionHeader=nil;
    self.firstSectionHeader= [NSString stringWithFormat:@"Events in %@", [dateFormatter stringFromDate:date]];
    NSLog(@" self.firstSectionHeader %@ ",self.firstSectionHeader);

}
#pragma Tableview
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [self.eventHeaders count] + 1;

}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 35;
}
//set header section labels
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 35)] ;
    [headerView setBackgroundColor:[UIColor colorWithRed:106/256.0 green:106/256.0 blue:106/256.0 alpha:1.0]];
    UILabel *subjectLabel = [[UILabel alloc] initWithFrame:CGRectMake(92, 10, tableView.bounds.size.width, 20)];
    subjectLabel.textColor = [UIColor whiteColor];
    subjectLabel.font = [UIFont fontWithName:@"Gill Sans" size:20];
    subjectLabel.backgroundColor = [UIColor clearColor];
    subjectLabel.text=self.firstSectionHeader;
    NSLog(@"subjectLabel.text %@",subjectLabel.text);

    if (section==0) {

        //[headerView addSubview:subjectLabel];
        return headerView;
    }
    else
        return nil;


}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if (section==0) {
         NSLog(@"self.firstSectionHeader in titleForHeaderInSection %@",self.firstSectionHeader);
        return self.firstSectionHeader;
    }
    else
        return nil;
}

What am I doing wrong?

Upvotes: 5

Views: 9580

Answers (7)

CristianMoisei
CristianMoisei

Reputation: 2279

heightForHeaderInSection and titleForHeaderInSection are both required it would seem. Implementing just titleForHeaderInSection didn't work for me, and adding heightForHeaderInSection fixed it.

Upvotes: 0

Alexander Stepanishin
Alexander Stepanishin

Reputation: 494

Also, you need to NOT implement both

(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

and

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

If you will implement one at least first method, then

- (NSString*)tableView:(UITableView *)tableView  titleForHeaderInSection:(NSInteger)section

won't be called.

Upvotes: 0

DrRocker
DrRocker

Reputation: 665

I know this thread is a little old, but make sure you also have:

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

The tableview will need to know the height before it can grab the view.

Upvotes: 0

Odrakir
Odrakir

Reputation: 4254

I think that's probably because you are only supposed to use one of the two: viewForHeaderInSection or titleForHeaderInSection.

Upvotes: 18

Tommie C.
Tommie C.

Reputation: 13181

Re: What am I doing wrong.

I am not certain if you are setting datasource and delegate on your view controller in Interface Builder or not. But I believe there is a logic error that impacts the expected outcome.

titleForHeaderInSection: Asks the data source for the title of the header of the specified section of the table view.

meanwhile

tableView:viewForHeaderInSection: Asks the delegate for a view object to display in the header of the specified section of the table view.

The latter method is overriding behavior defined for the titleForHeaderInSection. Think of it this way; you have one header space that can hold a title OR a custom view that you create to replace the default (title). You are telling the compiler to use a custom view by implementing the second method. To fix this comment out or remove the tableView:viewForHeaderInSection: method or change your logic so that you update the title in your custom view that you pass into the method. At that point titleForHeaderInSection should be hit correctly.

Please consider accepting this answer if it is successful in resolving your initial question.

Upvotes: 1

kavalerov
kavalerov

Reputation: 390

You have to do

self.meetingList.dataSource=self;

in viewDidAppear.

Upvotes: -1

artud2000
artud2000

Reputation: 544

You are missing self.meetingList.datasource = self;

Remember that your viewController has to implemente the UITableViewDelegate and the UITableViewDataSource.

YourClass : UITableView <UITableViewDelegate, UITableViewDataSource>

Upvotes: 1

Related Questions