UITableView метод reloadData создает проблему размытых данных
У меня есть UITableView
в котором каждый UITableViewCell
иметь UIView
на них и выше UIView
У меня два UIButton
и два UILabel
, Моя проблема заключается в том, что когда я перезагружаю табличное представление, тогда новые данные перезаписываются на старые данные, которые делают контент размытым и нечетким, и в методе cellForRowAtIndexPath
Я использовал этот код удаления метки, то он также не работает должным образом.......
NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
for (UILabel *subview in subviews) {
[subview removeFromSuperview];
}
[subviews release];
Этот код показывает строку за раз, иначе никто...
Код cellForRowAtIndexPath
это....
- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"Cell";
UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSDictionary *dict = [appDelegate.webDataList objectAtIndex:indexPath.row];
tableView.backgroundColor = [UIColor colorWithRed:0.39 green:0.39 blue:0.39 alpha:0.39];
if([appDelegate.dataArray count]>0){
imgView.backgroundColor = [UIColor clearColor];
imgView =[[UIView alloc ] initWithFrame:CGRectMake(0,0,320,45)];
imgView.tag= indexPath.row+250;
[cell.contentView addSubview:imgView];
button=[UIButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(291, 5, 19, 21);
img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
[button setBackgroundImage:img forState:UIControlStateNormal];
[button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
button.tag= indexPath.row+250;
[imgView addSubview:button];
button=[UIButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(-25, 5, 19, 21);
img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
[button setBackgroundImage:img forState:UIControlStateNormal];
[button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
button.tag= indexPath.row+250;
[imgView addSubview:button];
button=[UIButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(5, 7, 19, 21);
button.tag = indexPath.row+250;
img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"delete" ofType:@"png"]];
[button setBackgroundImage:img forState:UIControlStateNormal];
[button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[imgView addSubview:button];
NSArray *arr = [[appDelegate.dataArray objectAtIndex:indexPath.row] componentsSeparatedByString:@"/"];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
label.text = [arr objectAtIndex:1];
label.tag = indexPath.row+250;
[label setFont:[UIFont fontWithName:@"Georgia" size:14]];
[label setNumberOfLines:0];
label.textAlignment = UITextAlignmentLeft;
label.textColor = [UIColor whiteColor];
label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
label.backgroundColor = [UIColor clearColor];
[imgView addSubview:label];
[label release];
NSDictionary *dict1 =[appDelegate.webDataList objectAtIndex:indexPath.row];
label = [[UILabel alloc] initWithFrame:CGRectMake(181, 7, 75, 20)];
label.tag = indexPath.row+250;
label.text = [dict1 objectForKey:@"time"];
[label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
label.textAlignment = UITextAlignmentLeft;
[label setBackgroundColor:[UIColor clearColor]];
label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[label setTextColor:[UIColor whiteColor]];
[imgView addSubview:label];
[label release];
}
return cell;
}
и в моем коде я не могу использовать метод reuseTableViewCellWithIdentifier:
потому что я хочу, чтобы каждый ярлык и метка кнопки были одинаковыми, потому что я должен получить их где-нибудь еще.
1 ответ
Это происходит потому, что вы делаете это неправильно. Вам даже не нужно перезагрузить стол. Просто прокрутите вокруг, и вы заметите это.
Вы создаете новые метки и кнопки каждый раз, когда отображается ячейка. И эти элементы пользовательского интерфейса, конечно, никогда не удаляются.
Добавьте элемент пользовательского интерфейса при создании новой ячейки и присвойте им тег. Если ячейка была успешно удалена, возьмите элемент по этому тегу и установите его значения.
Как это:
if (cell == nil) {
// if no cell could be dequeued create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
// add label to the new cell
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
label.tag = 250; // <---- save tag
[label setFont:[UIFont fontWithName:@"Georgia" size:14]];
[label setNumberOfLines:0];
label.textAlignment = UITextAlignmentLeft;
label.textColor = [UIColor whiteColor];
label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
label.backgroundColor = [UIColor clearColor];
//[imgView addSubview:label]; // I ignore this because I don't want to write 200 lines of code here. This is just an example so please adopt the code yourself
[cell.contentView addSubView:label];
[label release];
}
// whatever happened you have a cell with all the labels added here
UILabel *label = (UILabel *)[cell.contentView viewWithTag:250] // <---- get label with tag
label.text = [arr objectAtIndex:1];
и тебе не нужно if([appDelegate.dataArray count]>0)
, Если все ваши другие методы источника данных tableview верны tableView:cellForRowAtIndexPath:
не вызывается, если ваш источник данных пуст.
Редактировать: Только что видел это:
и в моем коде я не могу использовать метод reuseTableViewCellWithIdentifier: потому что я хочу, чтобы каждый ярлык и метка кнопки были одинаковыми, потому что я должен получить их где-нибудь еще.
На самом деле вы можете. Каждый может и должен использовать reuseTableViewCellWithIdentifier:
,
Какие у вас проблемы с этим?
Если вам нужно получить indexPath (или в вашем случае только строку) в методе действия кнопки, используйте код из моего ответа на другой вопрос