2016-06-07 2 views
0

Я пытаюсь вывести свой NSMutableArray в UITableView, отображается tableView, но это вывод неправильных данных. Я ожидал что-то вроде этогоUITableViewCell, отображающий неверные данные

Check 10 
Try  11 
Test 12 

Вот мой код

- (void)viewDidLoad 
{ 
arr1 = [[NSMutableArray alloc] initWithObjects:@"Check",@"Try",@"Test" ,nil]; 
arr2 = [[NSMutableArray alloc] initWithObjects:@"10",@"11",@"12", nil]; 
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 400, 500, 500)]; 
self.tableView.dataSource = self; 
self.delegate = self; 
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cells"]; 
[self.view addSubview:self.tableView]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cells" forIndexPath:indexPath]; 

UIImageView *images = [[UIImageView alloc] initWithFrame:CGRectMake(8, 8, 50, 50)]; 
[images setImage:[UIImage imageNamed:[img objectAtIndex:indexPath.row]]]; 
[cell addSubview:images]; 

UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(131, 27, 59, 21)]; 
label1.text = [arr1 objectAtIndex:indexPath.row]; 
[cell addSubview:label1]; 

UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(231, 27, 67, 21)]; 
label2.text = [arr2 objectAtIndex:indexPath.row]; 
[cell addSubview:label2]; 

return cell; 
} 

И это выход

Check 10 
Try  11 
Check 10 
+0

ли не вы должны установить тег для каждого из объектов UILabel, если вы собираетесь использовать пользовательский UITableViewCell? –

+0

@ElTomato - Нет, так мы это делали много лет назад, но эта практика теперь обескуражена. В настоящее время наилучшей практикой является использование прототипа клетки, установка базового класса и подключение выходов в IB. Но вы определенно не должны просто добавлять subviews, как он здесь, так как при повторном использовании ячеек будут добавлены дубликаты меток. Или, если он собирается создавать программно, он должен проверить, действительно ли ячейка была удалена, и добавлять только объекты, если это новая ячейка. И он обновил свои свойства, чтобы указать на эти метки, а не на теги. – Rob

+0

drbj, вы действительно имеете дело только с тремя ячейками? Ваш код может привести к описанию поведения, которое вы описываете, только если ячейки прокручивались вне поля зрения, а другие ячейки прокручиваются в представлении (и, как правило, вы видели это поведение только в том случае, если у вас было достаточно нескольких строк данных). – Rob

ответ

3

Пожалуйста, не addSubView в cellForRowAtIndex из Tableview делегата. Потому что это называется несколько раз. В вашем случае, пользовательские UITableViewCell, такие как:

MyTableViewCell.h:

@interface MyTableViewCell : UITableViewCell 
- (void)setImages:(UIImage *)images label1:(NSString *)label1 label2:(NSString *)label2; 

@end 

MyTableViewCell.m:

@interface MyTableViewCell() 

@property (nonatomic, strong) UIImageView *images; 
@property (nonatomic, strong) UILabel *label1; 
@property (nonatomic, strong) UILabel *label2; 

@end 

@implementation MyTableViewCell 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    _images = [[UIImageView alloc] initWithFrame:CGRectMake(8, 8, 50, 50)]; 
    [self addSubview:_images]; 

    _label1 = [[UILabel alloc] initWithFrame:CGRectMake(131, 27, 59, 21)]; 
    [self addSubview:_label1]; 

    _label2 = [[UILabel alloc] initWithFrame:CGRectMake(231, 27, 67, 21)]; 
    [self addSubview:_label2]; 
} 

- (void)setImages:(UIImage *)images label1:(NSString *)label1 label2:(NSString *)label2 { 
    _images.image = images; 
    _label1.text = label1; 
    _label2.text = label2; 
} 

И изменить код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cells" forIndexPath:indexPath]; 

    UIImage *image = [UIImage imageNamed:[img objectAtIndex:indexPath.row]]; 
    NSString *text1 = [arr1 objectAtIndex:indexPath.row]; 
    NSString *text2 = [arr2 objectAtIndex:indexPath.row]; 

    [cell setImages:image label1:text1label2:text2]; 

    return cell; 
} 
+0

@interface MyTableViewCell: BaseViewController это в настоящее время в моем заголовке – drbj

+0

@drbj - Это не имеет смысла. «MyTableViewCell» должен, если это действительно ячейка в таблице, быть объявлен как Cuong здесь. Не путайте ячейку с контроллером вида. Единственное, чего не хватает в этом ответе, - это заменить код 'registerClass' на' [self.tableView registerClass: [класс MyTableViewCell] forCellReuseIdentifier: @ "cells"]; '. – Rob

+0

Я следил за вашим кодом, и я ошибаюсь в этой строке [cell setImages: image label1: text1label2: text2]; Нет видимого @interface для 'UITableViewCell' объявляет селектор 'setImages: label1 :::' – drbj

Смежные вопросы