我正在使用UITableView,我注意到我的tableview中的单元格在滚动时越来越大胆,它覆盖了内容,我想要停止这个但是看不到我出错的地方。
在我的UITableView上,出于某些原因,当我滚动tableview的内容时,会搞乱手动创建的UILabel。
我需要手动UILabel,因为我需要稍后使用自定义单元格。
当我上下滚动时,标签逐渐变得更大胆,更大胆;它们总是重叠,有时甚至会影响较低的行(甚至在它们处于视口之前)。
如果我继续这样做,细胞内容就会变得难以理解。
仅当backgroundColor未设置为clearColor
时才会发生这种情况。
我尝试[cellLabel setClearsContextBeforeDrawing:YES];
和[self.tableView setClearsContextBeforeDrawing:YES];
无效。
如果我使用cell.textLabel.text
,问题似乎就会消失。
代码和图像示例如下。
// Simple table view
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
//[self configureCell:cell atIndexPath:indexPath];
NSString *txt = @"Product";
//cell.textLabel.text = txt;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *cellView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, cell.frame.size.height)];
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[cellLabel setText:txt];
[cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[cellLabel setBackgroundColor:[UIColor clearColor]];
[cellView addSubview:cellLabel];
[cellLabel release];
[cell.contentView addSubview:cellView];
[cellView release];
return cell;
}
Image follows;
![image of uitableview][1]
[1]: http://i.stack.imgur.com/5lNy6.png
// Edit to include context
I am using a dictionary to display the contents of the UITableViewCells.
I have attempted to do the following;
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
[self configureCell:cell atIndexPath:indexPath];
} // end if
// Configure the cell...
//
// Moved to inside the cell==nil
return cell;
}
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
// Get the txt from the Dictionary/Plist... *removed due verboseness*
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[cellLabel setText:txt];
[cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[cellLabel setBackgroundColor:[UIColor clearColor]];
[cell.contentView addSubview:cellLabel];
[cellLabel release];
}
这虽然它解决了覆盖的问题 - 它会导致问题 - 它会使标签重复出现在完全随机的位置 - 以下只是一个例子,其他字段和标签也会重复。
见下图;
答案 0 :(得分:17)
// cell reuse
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
返回已经使用过的单元格,它已经有了一个UILabel子视图,你在它上面添加另一个。将添加子视图放在
部分 if (cell == nil) { //cell initialization
并根据需要编辑子视图在单元格初始化之后,您可以通过标记访问它们。
答案 1 :(得分:6)
您每次都会将标签添加到同一个重复使用的单元格中,这就是它变得更大胆的原因。当您使用dequeueReusableCellWithIdentifier时,您正在抓取已经在屏幕上显示的单元格,这是正确的操作,但您已经在其上放置了标签。由于标签每次都会在相对于单元格的相同位置,以及相同的颜色等。(唯一的动态元素将是文本),您应该只将其设置为一次。
我首选的解决方案是使用您想要的属性创建自定义单元格。所以在这种情况下,你会创建
@interfacce MyCustomCell : UITableViewCell
@property (nonatomic) UILabel *cellLabel;
@end
给它一个属性UILabel * cellLabel,除了在MyCustomCell.m的init中设置标签文本之外,执行上面的所有代码,用self替换任何单元格实例,例如:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
self.cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[self.cellLabel setText:txt];
[self.cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[self.cellLabel setBackgroundColor:[UIColor clearColor]];
}
return self;
}
现在在你的cellForRowAtIndexPath中使用MyCustomCell,你检查cell == nil,你可能还要检查单元格标签:
if(cell == nil || cell.cellLabel == nil)
以完全相同的方式初始化它:
cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
现在,您需要做的就是设置:
cell.cellLabel.text = ....;
你的cellForRowAtIndexPath中的代码更清晰,内存效率更高,并且你不会得到你的错误。
请记住在接口构建器中将您的单元格设置为MyCustomCell类型。
答案 2 :(得分:4)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = (UITableViewCell*)[self.YourTableName dequeueReusableCellWithIdentifier:nil];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
}
return cell;
}
使用ReusablecellIdentifier nil以使其正常工作.....
答案 3 :(得分:4)
这是一个比较老的线程。但对某人有用,
您可以删除添加到view
的所有cell
,然后才能在tableView
中重复使用{。}}。
此代码将执行此操作,
for (UIView* view in [cell.contentView subviews])
{
if ([view isKindOfClass:[UILabel class]]) //Condition if that view belongs to any specific class
{
[view removeFromSuperview];
}
}
这可以在配置单元格之前添加,
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier];
}
您还可以将单元格的标签值设置为nil,以避免在尾随单元格中重复。
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
cell.textLabel.font = nil;
答案 4 :(得分:2)
为collectionView编写此代码。它将有助于消除可重用单元格的双重性。
- (void)viewDidLoad {
[super viewDidLoad];
arrImg=[[NSMutableArray alloc]initWithObjects:@"images.jpeg",@"images-2.jpeg",@"images-3.jpeg", nil];
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setItemSize:CGSizeMake(375, 200)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
[self.colView setCollectionViewLayout:flowLayout];
self.colView.backgroundColor=[UIColor lightGrayColor];
self.colView.delegate=self;
self.colView.dataSource=self;
// Do any additional setup after loading the view, typically from a nib.
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
CollectionViewCell1 *cell=(CollectionViewCell1 *)[colView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell1" forIndexPath:indexPath];
float xAxis=0;
float maxwidth=0;
for (UIView* view in [cell.contentView subviews])
{
if ([view isKindOfClass:[UIScrollView class]]) //Condition if that view belongs to any specific class
{
[view removeFromSuperview];
}
}
if(indexPath.row==1)
{
UIScrollView *scroll=[[UIScrollView alloc]initWithFrame:CGRectMake(0,0, colView.frame.size.width, 200)];
scroll.delegate = self;
[cell.contentView addSubview:scroll];
for(int i=0;i<[arrImg count];i++)
{
UIImageView *img=[[UIImageView alloc]init];
xAxis=xAxis+maxwidth;
img.frame=CGRectMake(xAxis, 0, self.view.frame.size.width, 200);
img.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@",[arrImg objectAtIndex:i]]];
[scroll addSubview:img];
maxwidth=self.view.frame.size.width;
}
scroll.contentSize=CGSizeMake(375*3, 200);
scroll.pagingEnabled=YES;
}
return cell;
}
答案 5 :(得分:0)
尽量不要将UIView * cellView放在UITableViewCell *单元格上。 UITableViewCell是UIView的子类,因此您可以根据需要添加子视图。但是UITableViewCell里面已经有了一个标签。
只需使用[cell.textLabel setText:txt]
。
答案 6 :(得分:-1)
A-Live的答案是最好的解决方案。
然而,在我的实验中,我能够设置没有覆盖的UITableViewCells,并且没有将单元格值放在随机位置。
我使用的代码如下,它可以用tiyding,但它似乎现在有效;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UILabel *cellLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 120, 35)];
[cellLabel setFont:[UIFont boldSystemFontOfSize:12]];
[cellLabel setBackgroundColor:[UIColor clearColor]];
[cellLabel setTag:1];
[cell.contentView addSubview:cellLabel];
[cellLabel release];
// TextInput setup
CGRect cellTextFrame = CGRectMake(200, 12, 65, 30);
UITextField *txtInputField = [[UITextField alloc] initWithFrame:cellTextFrame];
[txtInputField setTag:2];
[txtInputField setDelegate:self];
[txtInputField setClearButtonMode:UITextFieldViewModeWhileEditing];
[txtInputField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
[txtInputField setFont:[UIFont systemFontOfSize:12]];
[txtInputField setReturnKeyType:UIReturnKeyDone];
[txtInputField setTextAlignment:UITextAlignmentLeft];
[txtInputField setKeyboardAppearance:UIKeyboardAppearanceDefault];
[txtInputField setKeyboardType:UIKeyboardTypeNumbersAndPunctuation];
[txtInputField setAutocorrectionType:UITextAutocorrectionTypeNo];
[txtInputField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
txtInputField.clearButtonMode = UITextFieldViewModeWhileEditing;
[txtInputField setBorderStyle:UITextBorderStyleRoundedRect];
txtInputField.textColor = [UIColor colorWithRed:56.0f/255.0f green:84.0f/255.0f blue:135.0f/255.0f alpha:1.0f];
//[txtInputField addTarget:self action:@selector(textFieldFinished:) forControlEvents:UIControlEventEditingDidEndOnExit];
[cell.contentView addSubview:txtInputField];
[txtInputField release];
} // end if
// Configure the cell...
//
//[self configureCell:cell atIndexPath:indexPath];
UILabel *label = (UILabel *)[cell viewWithTag:1];
[label setText:txt];
UITextField *txtField = (UITextField *) [cell viewWithTag:2];
[txtField setText:txtText];
[txtField setPlaceholder:txtPlaceholder];
return cell;