As part of a table, is it possible for TableViewCell to have different heights?
If, so, how can this be done?
Using the UITableViewDelegate method :
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Yes you will have to override the following function for your tableview datasource delegates::
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
Related
I've created classes both to be the dataSource and delegate of a table view. While the cells are appearing properly, I am finding that this method:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
is not getting called.
What would be a reason for this?
All I could think of was verifying that I did not implement:
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
and I DID implement:
- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section`
Is there any other reason the method would not be called?
First of all, do not mark this as duplicate right away. I know that using UITableViewDataSource methods with static cells is not recommended and usually results in a crash, but I want to know the behavior that leads to this.
In the IB, I have a UITableViewController with 10 different static cells in a single section. I want to be able to rearrange and separate them into multiple sections without using prototype cells, since they will never be reused. Below are my implementations for the data source methods:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return self.indexMappings.count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [(NSArray*)self.indexMappings[section] count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell;
NSIndexPath *mappedIndexPath = [self getMappedIndexPathForIndexPath:indexPath];
cell = [super tableView:tableView cellForRowAtIndexPath:mappedIndexPath];
return cell;
}
The problem here is, if self.indexMappings.count is greater than the number of sections in my static table, the app crashes. But if its less than or equals, the mappings work just fine. For clarification, self.indexMappings is a two dimensional NSArray*. Anyone know the reason for this behavior?
I found out that the way to do this is to also implement some of the UITableViewDataSource methods as well. When the app crashes, it can be seen from the call stack that the methods causing the trouble are methods that determine the header or footer height, or header or footer views, etc. After implementing the following methods to return some default values, the problem was solved.
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
I'm using the delegate method tableview: willDisplayCell: forRowAtIndexPath to make visual changes to my UITableViewCell's with. The problem is that this only seems to work after I scroll through the table. The cells that are shown before I scroll don't have a change until I scroll. My delegate method is as follows:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.frame = CGRectMake(0,0,300.0f,100.0f);
}
Any ideas as to how I get the initial cells to look the same as they do once I scroll?
I don't think you can change the frame of a cell during
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
try this instead.
- (void)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
I want to add search bar to UITableView header, it's visible on IB but not on emulator after running
Check that you are actually calling- initWithNibName: bundle: method properly.
Actually headers are the part of section in table view, so ur view controller class must conform to UITableViewDelegate protocol and must implements the method
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
and for customization of ur header view use
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
example
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 25.0f;
}
or you can use UITableViewDataSource method
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return #"#";
}
I have a project in which I need to put two UITableView on one UIView.
I know it needs to set <UITableViewDelegate,UITableViewDataSource> and can function below:
-(NSString *) tableView:(UITableView *) tableView
titleForHeaderInsection:(NSInteger)section
- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
-(NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
but I do not know if these can process two tableviews (different from 2 sections).
It looks like you're asking if one object (maybe a view controller?) can have two UITableViews both using it as their delegate. Yes, a view controller can be the delegate for multiple table views-- that's why all of those methods pass in a UITableView* as their first argument; it's for you to use to figure out which one is which. You should keep a couple instance variables (IBOutlets probably) in your view controller so you know which is which and you can act appropriately.
Cheers,
Interdev.