ios 如何使用 UItableViewCell 重用标识符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15378522/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to use UItableViewCell reuseIdentifier
提问by pengwang
I want to use UITableviewCell
reuse,I have a custom UITableViewCell
and using ARC,my UITableViewCell
is different . my code is:
我想使用UITableviewCell
重用,我有一个自定义UITableViewCell
并使用 ARC,我UITableViewCell
的不同。我的代码是:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PostCount *post=[listArr objectAtIndex:indexPath.row];
static NSString *CellIdentifier = @"TimeLineViewCell";
TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"];
}
cell.tag=indexPath.row+1000;
cell.lab_time.text=[ModelClass intervalSinceNow:post.when btime:0];
cell.delegate=self;
[cell setViewStyle:post];
post=nil;
return cell;
}
you know if I use
你知道我是否使用
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]
instead
反而
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"];
My cell always at mistake location. Why am I not able to use the same reuseIdentifier
. If I use a different reuseIdentifier,if my cell is not reuse.
我的手机总是在错误的位置。为什么我不能使用相同的reuseIdentifier
. 如果我使用不同的重用标识符,如果我的单元格没有被重用。
For other Viewcontroller views, when height of the cell is the same and I use the same reuseIdentifier
everything is ok. Can anybody help me with the problem?
对于其他 Viewcontroller 视图,当单元格的高度相同并且我使用相同的时,reuseIdentifier
一切正常。有人可以帮我解决这个问题吗?
Edit:My Custom cell code:
编辑:我的自定义单元格代码:
#import "TimeLineViewCell.h"
@implementation TimeLineViewCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
imageView_t=[[UIImageView alloc]initWithFrame:CGRectMake(5, 5, 40, 40)];
imageView_t.hidden=YES;
imageIcon=[[UIImageView alloc]initWithFrame:CGRectMake(295, 5, 16, 16)];
self.lab_time = [[UILabel alloc] initWithFrame:CGRectMake(210, 5, 80, 20)];
self.lab_time.textColor=[UIColor grayColor];
self.lab_time.font=[UIFont systemFontOfSize:12];
self.lab_time.textAlignment=UITextAlignmentRight;
self.lab_time.backgroundColor=[UIColor clearColor];
whoscreenName = [[UILabel alloc] initWithFrame:CGRectMake(60, 5, 145, 20)];
whoscreenName.textColor=[UIColor blackColor];
whoscreenName.font=[UIFont systemFontOfSize:18];
whoscreenName.lineBreakMode = UILineBreakModeTailTruncation;
whoscreenName.numberOfLines = 0;
whoscreenName.backgroundColor=[UIColor clearColor];
myWhat = [[UITextView alloc] init];
myWhat.textColor=[UIColor blackColor];
myWhat.backgroundColor=[UIColor clearColor];
[myWhat setScrollEnabled:NO];
[myWhat setEditable:NO];
myWhat.dataDetectorTypes=UIDataDetectorTypeLink;
[myWhat setCanCancelContentTouches:NO];
self.myWhaticon=[[UIView alloc]init];
myImageView=[[UIImageView alloc]init];
myImageView.hidden=YES;
myIndicatorView=[[UIActivityIndicatorView alloc ]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
myIndicatorView.hidden=YES;
whoBgView=[[UIImageView alloc]init];
whoBgView.image = [[UIImage imageNamed:@"timeline_rt_border_t.png"] stretchableImageWithLeftCapWidth:130 topCapHeight:7];
whoWhat = [[UITextView alloc] init];
whoWhat.textColor=[UIColor blackColor];
whoWhat.backgroundColor=[UIColor clearColor];
[whoWhat setScrollEnabled:NO];
[whoWhat setEditable:NO];
whoWhat.dataDetectorTypes=UIDataDetectorTypeLink;//url
[whoWhat setCanCancelContentTouches:NO];
whoImageView=[[UIImageView alloc]init];
whoImageView.hidden=YES;
activityIndicatorView=[[UIActivityIndicatorView alloc ]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicatorView.hidden=YES;
myWhat.font=[UIFont systemFontOfSize:15];
whoWhat.font=[UIFont systemFontOfSize:14];
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self addSubview:imageView_t];
[self addSubview:imageIcon];
[self addSubview: self.lab_time];
[self addSubview:whoscreenName];
[self addSubview:myWhat];
[self addSubview:self.myWhaticon];
[self addSubview:myImageView];
[self addSubview:myIndicatorView];
[self addSubview:whoBgView];
[whoBgView addSubview:whoWhat];
[whoBgView addSubview:whoImageView];
[whoBgView addSubview: activityIndicatorView];
whoImageView=nil;
whoWhat=nil;
}
-(void)my_imag_btnClick:(UIButton *)btn{
[self.delegate my_imag_btnClick:btn.tag];
}
-(void)who_imag_btnClick:(UIButton *)btn{
NSLog(@"who_imag_btnClick");
[self.delegate who_imag_btnClick:btn.tag];
}
- (void)dealloc
{
imageView_t.image=nil;
imageView_t=nil;
imageIcon.image=nil;
imageIcon=nil;
whoscreenName=nil;
self.lab_time=nil;
whoscreenName=nil;
myWhat=nil;
self.myWhaticon=nil;
myImageView.image=nil;
myImageView=nil;
whoBgView.image=nil;
whoBgView=nil;
whoImageView.image=nil;
whoImageView=nil;
}
-(void)setViewStyle:(PostCount *)post{
//时间
if (self.btime==1) {
self.lab_time.text=[ModelClass intervalSinceNow:post.when btime:1 ];
}else{
self.lab_time.text=[ModelClass intervalSinceNow:post.when btime:0];
}
imageView_t.hidden=NO;
// imageView_t.isRoundIcon=YES;
imageView_t.layer.cornerRadius = 5;
imageView_t.layer.masksToBounds = YES;
//给图层添加一个有色边框
imageView_t.layer.borderWidth = 0.8;
imageView_t.layer.borderColor = [[UIColor colorWithRed:230.0/255 green:230.0/255 blue:230.0/255 alpha:1.0] CGColor];
if(![GlobalVariable isBlankString:post.who.avatarbig])
{
[imageView_t setImageWithURL:[NSURL URLWithString:post.who.avatarbig]
placeholderImage:[UIImage imageNamed:@"default_user.png"]];
}
else{
imageView_t.image=[UIImage imageNamed:@"default_user.png"];
}
//icon
imageIcon.image=[UIImage imageNamed:[ModelClass returnimage_source:post.source]];
whoscreenName.text=post.who.screenName;
CGSize size_myWhat =[ModelClass heightForTextView:[UIFont systemFontOfSize:15] WithText:post.what weith:250];
myWhat.frame=CGRectMake(50, 25, 250, size_myWhat.height);
myWhat.text=[NSString stringWithFormat:@"%@",post.what];
self.myWhaticon.frame=myWhat.frame;
if(![GlobalVariable isBlankString:post.img_small])
{
CGSize size_myImageView=CGSizeMake(80, 80);
myImageView.frame=CGRectMake(50, 30+size_myWhat.height, size_myImageView.width, 80);
myImageView.hidden=NO;
myIndicatorView.center=myImageView.center;
myIndicatorView.hidden=NO;
[myIndicatorView startAnimating];
__block UIActivityIndicatorView *indicatorView=myIndicatorView;
__block UIImageView *myImage = myImageView;
[myImageView setImageWithURL:[NSURL URLWithString:post.img_small]
placeholderImage:nil
success:^(UIImage *image){
CGRect sFrame=myImage.frame;
//缩放
CGSize newSize=image.size;
if (newSize.height>80) {
newSize.height=80;
newSize.width=newSize.width*80.0/image.size.height;
}else{
if (newSize.width>80) {
newSize.height=newSize.height *80.0/image.size.width;
newSize.width=80;
}else{//2个都小于80
newSize.height=newSize.height;
newSize.width=newSize.width;
}
}
sFrame.size=newSize;
myImage.frame=sFrame;
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}
failure:^(NSError *error){
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}];
UIButton * myImageBtn=[[UIButton alloc]init];
myImageBtn.frame= CGRectMake(50, 30+size_myWhat.height, size_myImageView.width, 80);
[myImageBtn addTarget:self action:@selector(my_imag_btnClick:) forControlEvents:UIControlEventTouchUpInside];
myImageBtn.tag=self.tag-1000;
// myImageBtn.backgroundColor=[UIColor blueColor];
[self addSubview:myImageBtn ];
}
if ([post.sourceTweet.what length]>0) {
whoWhat.text=[NSString stringWithFormat:@"@%@: %@",post.sourceTweet.who.screenName,post.sourceTweet.what];
}
CGSize size_whoWhat =[ModelClass heightForTextView:[UIFont systemFontOfSize:14] WithText:whoWhat.text weith:250];
whoWhat.frame=CGRectMake(10, 10, 250, size_whoWhat.height);
if(![GlobalVariable isBlankString:post.sourceTweet.img_small])
{
CGSize size_whoImageView=CGSizeMake(80, 80);
whoImageView.frame=CGRectMake(30, 15+size_whoWhat.height, size_whoImageView.width, 80);
whoImageView.hidden=NO;
activityIndicatorView.center=whoImageView.center;
activityIndicatorView.hidden=NO;
[activityIndicatorView startAnimating];
__block UIActivityIndicatorView *indicatorView = activityIndicatorView;
__block UIImageView *whoImage = whoImageView;
[whoImageView setImageWithURL:[NSURL URLWithString:post.sourceTweet.img_small]
placeholderImage:nil
success:^(UIImage *image){
CGRect sFrame=whoImage.frame;
//缩放
CGSize newSize=image.size;
if (newSize.height>80) {
newSize.height=80;
newSize.width=newSize.width*80.0/image.size.height;
}else{
if (newSize.width>80) {
newSize.height=newSize.height *80.0/image.size.width;
newSize.width=80;
}else{//2个都小于80
newSize.height=newSize.height;
newSize.width=newSize.width;
}
}
sFrame.size=newSize;
whoImage.frame=sFrame;
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}
failure:^(NSError *error){
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}];
UIButton * whoImageBtn=[[UIButton alloc]init];
int myimageHeight=0;
if (myImageView.frame.size.height>0) {
myimageHeight=5+80;
}
whoImageBtn.frame=CGRectMake(30+42, 40+size_myWhat.height+size_whoWhat.height+myimageHeight, 80, 80);
whoImageBtn.backgroundColor=[UIColor clearColor];
[whoImageBtn addTarget:self action:@selector(who_imag_btnClick:) forControlEvents:UIControlEventTouchUpInside];
whoImageBtn.tag=self.tag-1000;
[self addSubview:whoImageBtn ];
}
if (size_whoWhat.height<20) {
whoBgView.hidden=YES;
}else{
int myimageHeight=0;
if (myImageView.frame.size.height>0) {
myimageHeight=5+80;
}
whoBgView.frame=CGRectMake(42, 25+size_myWhat.height+myimageHeight, 270, 20+size_whoWhat.height+whoImageView.frame.size.height);
}
}
@end
回答by AMayes
Either don't reuse the cells, or give each one a custom identifier.
要么不要重复使用这些单元格,要么给每个单元格一个自定义标识符。
For custom identifiers, replace this:
对于自定义标识符,请替换:
static NSString *CellIdentifier = @"TimeLineViewCell";
TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier11"];
}
with this:
有了这个:
TimeLineViewCell *cell = (TimeLineViewCell*)[tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]];
if(cell==nil){
cell = [[TimeLineViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"%i", indexPath.row]];
}
Otherwise, just don't dequeue, and create a new cell every time.
否则,不要出队,每次都创建一个新单元格。
Note: custom identifiers based on the cell's indexPath.row will only work if there is no table editing going on by the user. If they WILL edit the table, don't reuse the cells.
注意:基于单元格的 indexPath.row 的自定义标识符仅在用户没有进行表格编辑时才有效。如果他们将编辑表格,请不要重复使用单元格。
回答by NyNex451
The blog provided by @Praveen has the right answer. You have to implement the following method as @Sean D. mentioned:
@Praveen 提供的博客有正确的答案。您必须实现@Sean D. 提到的以下方法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
This is the right way to set the height of TableViewCells. You have to determine the height of the row based on the content of the cell. As you know indexPath, you can determine the height for each row through indexPath.row
这是设置 TableViewCells 高度的正确方法。您必须根据单元格的内容确定行的高度。众所周知indexPath,可以通过indexPath.row确定每一行的高度
回答by Timur Kuchkarov
Implement - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
as @Sean mentioned.
Should look like this:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
正如@Sean 提到的那样实施。应该是这样的:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self calculateRowHeighForIndexPath:indexPath];
}
- (CGFloat)calculateRowHeighForIndexPath:(NSIndexPath *)indexPath
{
//return height of corresponding image here
}
回答by Pavel Yakimenko
I think the error is here:
我认为错误在这里:
cell.tag=indexPath.row+1000;
cell.tag=indexPath.row+1000;
When you reusing the cell you will owerwrite it's tag with the new value. It is better to check the cell number with
当您重用单元格时,您将使用新值编写它的标签。最好使用以下方法检查单元格编号
[tableView indexPathForCell:cell];
[tableView indexPathForCell:cell];
Please note it will return the correct indexPath for the visible cell only.
请注意,它只会为可见单元格返回正确的 indexPath。
回答by Praveenkumar
I'm following below way to reuse the UITableViewCell
identifier
我正在按照以下方式重用UITableViewCell
标识符
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
UILabel *label = nil;
cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];
label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setLineBreakMode:UILineBreakModeWordWrap];
[label setMinimumFontSize:FONT_SIZE];
[label setNumberOfLines:0];
[label setFont:[UIFont systemFontOfSize:FONT_SIZE]];
[label setTag:1];
[[label layer] setBorderWidth:2.0f];
[[cell contentView] addSubview:label];
}
NSString *text = [items objectAtIndex:[indexPath row]];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
if (!label)
label = (UILabel*)[cell viewWithTag:1];
[label setText:text];
[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];
return cell;
}
Code extracted from thisblog. It may helps you!
从这个博客中提取的代码。或许能帮到你!