我只是在我的应用中实现了一个表格视图。我已经多次这样做了,但这次表格单元显示重复数据和表格滚动的速度也不好。只需发布我的代码表。任何有助于防止单元格数据重复和滚动速度的帮助 优化将不胜感激。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int count = [array count];
if (count%3 == 0)
{
return count;
}
else
{
count = count/3+1;
}
NSLog(@"Row count is%i",count);
return count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
}
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 490, 221)];
int x = 15;
int y = 15;
int p = 10;
int q = 10;
for (int i = 0; i < 3; i++)
{
if ( indexPath.row*3+i < [array count] )
{
UIImageView *img = [[UIImageView alloc] init];
UIButton *btn = [[UIButton alloc] init];
[img setImageWithURL:[NSURL URLWithString:[array objectAtIndex:indexPath.row*3+i]]
placeholderImage:[UIImage imageNamed:@"India.png"]
success:^(UIImage *image) {}failure:^(NSError *error){}];
img.frame = CGRectMake(x, y, 140, 201);
btn.frame = CGRectMake(p, q, 150, 211);
btn.tag = indexPath.row*3+i;
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_N.png"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_S.png"] forState:UIControlStateHighlighted];
[btn addTarget:self action:@selector(Movie_detail:) forControlEvents:UIControlEventTouchUpInside];
[testView addSubview:img];
[testView addSubview:btn];
x = x+160;
p = p+160;
}
else
{
NSLog(@"No data");
break;
}
}
[cell addSubview:testView];
return cell;
}
在单元格中更新的内容是为了在单个单元格中添加3个按钮。没别了。
答案 0 :(得分:2)
建议
使用自定义单元格
修复:
创建和添加子视图将包含在分配单元格的大括号内
即
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
//CREATING AND ADDING SUBVIEW SHOULD BE HERE
}
//Change in values is taken care here
<强>原因强>
否则,每次创建子视图时,都会分配所有对象,并在滚动表时添加上面的
<强> REFER 强>
答案 1 :(得分:1)
您面临的问题是您为进入屏幕的每个单元格添加了UIView。但是,您正在重复使用单元格,因此旧的“添加”视图仍在其中。重复数据是因为滚动时单元格上有多层测试视图。
你应该创建一个包含你在每个cellforrow中添加的testview的CustomCell:或者当cell仍然是nil-value时,将testview添加到cellviews中,这样如果它被重用,你将不再添加另一个testview到细胞并且它们重叠。这些例子在这里写在其他答案中,但可以在网上找到。
不推荐但是:
另一个快速但又脏的修复方法是从单元格中删除所有子视图(或者将testview添加到的任何子视图)for(UIView *v in [cell(.contentView) subviews]){ [v removeFromSuperView]; }
答案 2 :(得分:0)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 490, 221)];
int x = 15;
int y = 15;
int p = 10;
int q = 10;
for (int i = 0; i < 3; i++)
{
if ( indexPath.row*3+i < [array count] )
{
UIImageView *img = [[UIImageView alloc] init];
UIButton *btn = [[UIButton alloc] init];
[img setImageWithURL:[NSURL URLWithString:[array objectAtIndex:indexPath.row*3+i]]
placeholderImage:[UIImage imageNamed:@"India.png"]
success:^(UIImage *image) {}failure:^(NSError *error){}];
img.frame = CGRectMake(x, y, 140, 201);
btn.frame = CGRectMake(p, q, 150, 211);
btn.tag = indexPath.row*3+i;
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_N.png"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_S.png"] forState:UIControlStateHighlighted];
[btn addTarget:self action:@selector(Movie_detail:) forControlEvents:UIControlEventTouchUpInside];
[testView addSubview:img];
[testView addSubview:btn];
x = x+160;
p = p+160;
}
else
{
NSLog(@"No data");
break;
}
}
[cell addSubview:testView];
}
return cell;
}
你不应该在初始化cell
的区块之外初始化任何内容,因为当scroll
tableview
方法cellForRowAtIndexPath
每次都被调用时,您的视图{每次都会创建{1}} ..
在单元初始化之外,您应该只更新要在单元格中显示的值..
希望以上工作..
<强>被修改强>
但更好的方法我建议尝试创建一个testview
,以便您可以轻松访问添加到单元格中的组件,以便在您的tableview滚动时更新其值。
感谢。
答案 3 :(得分:0)
你好,当你使用dequeueReusableCell
按照下面列出的方法进行更改。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
UIView *testView;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 490, 221)];
testView.tag = 111;
[cell addSubview:testView];
[testView release];//For Non ARC
}
else
{
testView = [cell.contentView viewWithTag:111];
for(UIView * vv in [testView subViews])
{
[vv removeFromSuperView];
}
}
int x = 15;
int y = 15;
int p = 10;
int q = 10;
for (int i = 0; i < 3; i++)
{
if ( indexPath.row*3+i < [array count] )
{
UIImageView *img = [[UIImageView alloc] init];
UIButton *btn = [[UIButton alloc] init];
[img setImageWithURL:[NSURL URLWithString:[array objectAtIndex:indexPath.row*3+i]]
placeholderImage:[UIImage imageNamed:@"India.png"]
success:^(UIImage *image) {}failure:^(NSError *error){}];
img.frame = CGRectMake(x, y, 140, 201);
btn.frame = CGRectMake(p, q, 150, 211);
btn.tag = indexPath.row*3+i;
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_N.png"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"Picframe_S.png"] forState:UIControlStateHighlighted];
[btn addTarget:self action:@selector(Movie_detail:) forControlEvents:UIControlEventTouchUpInside];
[testView addSubview:img];
[testView addSubview:btn];
x = x+160;
p = p+160;
}
else
{
NSLog(@"No data");
break;
}
}
return cell;
}
尝试这个....
答案 4 :(得分:0)
在不同的单元格中重复数据可能是由于相同的“CellIdentifier”,尝试针对不同的单元格视图类型使用不同的“CellIdentifier”。我可以看到不同的单元格视图类型,因为您的代码中有一些条件块。
static NSString *MyIdentifier;
MyIdentifier = @"Type1";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
}
MyIdentifier = @"Type2";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier];
}