我在uitableview单元格中显示超过10列并且有超过100行,但是当我滚动tableview或重新加载表时,它收到了内存警告,应用程序崩溃了。 我们也在使用折叠和扩展此表视图。
以下代码应用于cellforrowatindexpath
for(i=0;i<[appDel.tempItemDic count];i++)
{
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(CNT+30, -30, 350,100)];
label.font = [UIFont systemFontOfSize:14.0];
label.text =[tempDic objectForKey:[appDel.arrColumnList objectAtIndex:[[appDel.tempArr objectAtIndex:i]intValue]]];
label.textAlignment = UITextAlignmentLeft;
label.textColor = [UIColor whiteColor];
label.backgroundColor=[UIColor clearColor];
label.numberOfLines=1;
[cell.contentView addSubview:label];
[label release];
backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"ListItems_secondLevel(3).png"]];
cell.backgroundView = backgroundView;
cell.imageView.image=[UIImage imageNamed:@"arrow.png"];
CNT+=350;
}
答案 0 :(得分:0)
您只需在创建单元格时创建UILabel
。在重用单元格时,您可以使用tag
获取UILabel并将值设置为该值。不要一次又一次地创造。
修改强>: 除此之外,正如Sarah所提到的,你不需要在循环中这样做。至于调用该方法的每个单元格,您可以根据indexPath设置该值。
答案 1 :(得分:0)
您在方法中不需要for loop
。由于objectatIndex
适用于此。删除for循环,因为您已经在使用objectAtIndex
并重试。
答案 2 :(得分:0)
可能你没有重复使用这个细胞。因此,如果您创建了100个单元格,并且每个单元格都有10个标签,那么UILabel视图将保留在内存中。 你应该以这种方式重用单元格(代码没有经过测试,只是为了给你一个想法,我不是在评论你创建文本的方式,我只关心内存警告):
-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// add your code here to get the number of columns; I assume you defined a "getNumberOfColumnsForRowAtIndexPath:" somewhere in your code to retrieve this figure
NSInteger numberOfColumns = [appDel getNumberOfColumnsForRowAtIndexPath:indexPath];
NSString *cellId=[NSString stringWithFormat:@"MyComplexCellID_%d",numberOfColumns];
UITableViewCell *cell = [tv dequeReusableCellWithIdentifier:cellId];
if(!cell) {
// here you create the cell and add the labels; DON'T GIVE TEXT TO THE LABELS HERE
// in order to get the right label give them a tag; e.g. 500 is column 0, 501 column 1,...
for(int i=0;i<numberOfColumns;i++) {
UILabel *myLabel = ...
myLabel.tag=500+i;
}
}
// here you configure the cell
for(int i=0;i<numberOfColumns;i++) {
NSString *columnText = retrieve here your column text;
UILabel *labelColumn = (UILabel *)[cell.contentView viewWithTag:500+i];
labelColumn.text = columnText;
}
return cell;
}
答案 3 :(得分:0)
如果您在表格视图中加载大量数据,我会建议您
1: -
(void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableview reloadData];
});
}
2: -
(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread");
[self methodForServerResponse];
});
}
在那个methodForServerResponse -
中(void)methodForServerResponse{
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(q, ^{
NSLog(@"DISPATCH_QUEUE_PRIORITY_HIGH - Main Thread within Main Thread");
//implement what you stuff need from server
});