开发者

Where to place the update logic for a custom UITableViewCell? (iPhone)

I just have a quick "best practice" question regarding custom cells in a UITableView. My problem arises when I have build a custom cell in the if(cell == nil) block in the

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

(1) If I build labels and set the text property of these inside the (cell == nil) block; only the cells visible on the screen will have the correct text in them, the rest will just be reused.

(2) Ok, so I try moving the building of the custom cell outside the block. This of course results in my cells getting redrawn over and over again each time a user scrolls… and on top of each other.

(3) I also tried placing the drawing of the custom cell (labels, graphics etc.) inside the (cell == nil) block, but setting the labels.text property after the block. This can't be done as my UILabels then can't be accessed from outside the block they were instantiated in. I could do some crazy for(UILabel *l in cell.contentView.subviews ) but that would require an if statement for each label and probably some tags to identify them with.

(4) I could then declare all my labels before the (cell == nil) block and then just do the instantiation and drawing inside the block and setting the text property after the (cell == nil) block. But as I passed 10 UIlabels this looks and feels really messy, having them spread out like this inside and outside the (cell == nil) block, plus they would be declared each time the table has to "refresh".

The reason I ask is because when using 2-4 labels I have always found a way around it, but this time I need 12 custom UILabels set up and I would like to do it so that I have to redraw the least amount of graphics, as there probably will be a lot of cells.

I have seen examples where p开发者_如何学运维eople and the Apple docs uses a:

- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

But I can't really see how that would help me out:)

Hope someone could point out a "best practice" for these sort of things.

Thank you!


Your option 3 is the way to go. Create the cell with all its subviews whenever a new cell is required (i.e., in the if (cell == nil) block) and set the contents of your labels after the block.

If you use a custom UITableViewCell subclass, you could declare a property for each label and then access them with cell.myLabelX outside the block. If not, I would use the tag property to make the connection. At cell creation, assign a unique tag to each label:

UILabel *label1 = [[UILabel alloc] initWithFrame:...];
label1.tag = MYLABEL1TAG;
[cell addSubview:label1];
...

Outside the block, retrieve the labels through their tags:

UILabel *label1 = (UILabel *)[cell viewWithTag:MYLABEL1TAG];
label.text = ...

This is also how Apple does it in many places in their sample code (at least that's how they did it when I last looked).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜