Reputation: 51
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
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
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
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
Reputation: 4254
I think that's probably because you are only supposed to use one of the two: viewForHeaderInSection
or titleForHeaderInSection
.
Upvotes: 18
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
Reputation: 390
You have to do
self.meetingList.dataSource=self;
in viewDidAppear.
Upvotes: -1
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