Reputation: 19283
I have a table with custom header views that no matter when, or what value I choose for section, I always get nil value. I have another table with the same problem.
I can see the header views if I print the value of [tableview subviews], but I don't know why the method won't return anything.
What I am trying to do is to get an activityIndicator that is in the headerview and start it or stop it with a method call.
The headers are always painted ok, but I can't get a reference back to it. Also, calling headerViewForSection:
doesn't call the delegate method, is that normal?
footerViewForSection:
has the same problem
Some code:
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells" owner:nil options:nil];
UIView* header = [objs objectAtIndex: 0];
UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*) [header viewWithTag:5];
[activityIndicator startAnimating]
return header;
}
from any method:
UIView* headerView = [tableview headerViewForSection: section]; //returns nil
if (headerView) {
UIActivityIndicatorView* activityIndicator = (UIActivityIndicatorView*)[headerView viewWithTag: 5];
[activityIndicator stopAnimating];
}
Upvotes: 19
Views: 16118
Reputation: 66302
From the docs:
To make the table view aware of your header or footer view, you need to register it. You do this using the
registerNib:forHeaderFooterViewReuseIdentifier:
orregisterClass:forHeaderFooterViewReuseIdentifier:
method ofUITableView
.
(The Swift equivalent is register(_:forHeaderFooterViewReuseIdentifier:)
.)
So you need to register the nib, and then get it using a reuse identifier, instead of pulling it straight out of the app bundle, which is what you're doing now.
...if you want to use the headerViewForSection
method.
Alternatively, you could check whether to keep spinning inside the viewForHeaderInSection
method and then send just call:
[self.tableView beginUpdates];
[self.tableView endUpdates];
To refresh the section header.
(Note that this alternative approach will destroy and recreate your whole view, so if you have a big table with lots of data, it may not be very efficient.)
Upvotes: 18
Reputation: 1396
In swift
All you need is to create an instance of UITableViewHeaderFooterView
for the header view you need to return
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let sectionHeaderView = UITableViewHeaderFooterView()
//customize your view here
return sectionHeaderView
}
Upvotes: 5
Reputation: 20274
It's been awhile since this question was asked and recently I had come across a similar issue and had asked my own question here: UITableView -headerViewForSection returns (null)
I believe I have the answer.
UITableViewHeaderFooterView
subclass and name it CustomHeaderView
iPadTableCells
here)CustomHeaderView
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
Use the following code:
- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
static NSString *HeaderIdentifier = @"header";
CustomHeaderView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:HeaderIdentifier];
if(!header) {
NSArray* objs = [[NSBundle mainBundle] loadNibNamed:@"iPadTableCells"
owner:nil
options:nil];
header = [objs objectAtIndex: 0];
}
[header.activityIndicator startAnimating];
return header;
}
then you can access it this way:
CustomHeaderView *headerView = (CustomHeaderView*)[tableView headerViewForSection:section];
[headerView.activityIndicator stopAnimating];
Upvotes: 9