TableViewCell не отображает макет

Вот вопрос о tableViewCell. Я впервые пробую свои силы в табличных представлениях и пытаюсь разобраться с многоразовыми ячейками и т. Д. Мне удалось заставить его работать в некоторой степени. У меня есть tableView, который живет на дочернем контроллере представления, который является его делегатом и источником данных. Код для делегата:

#import "ChildViewController.h"

@interface ChildViewController ()

@property NSArray *titles;

@property NSArray *thumblenails;

@end

@implementation ChildViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.titles = [NSArray arrayWithObjects:@"Title 1", @"Title 2", @"Title 3", @"Title 4",nil];

    self.thumblenails = [NSArray arrayWithObjects:@"Image1", @"Image2", @"Image3", @"Image4", nil];

}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return self.titles.count;
}

-(UITableViewCell *)tableView:(UITableView *)TableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    SimpleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

//  cell.textLabel.backgroundColor = [UIColor greenColor];

    cell.textLabel.text = [self.titles objectAtIndex:indexPath.row];
    cell.imageView.image = [UIImage imageNamed:[self.thumblenails objectAtIndex:indexPath.row]];

    return cell;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

У меня также есть SimpleTableViewCell.xib:

введите здесь описание изображения

Я установил класс в инспекторе удостоверений на SimpleTableViewCell и импортировал файл SimpleTableViewCell.h в свой ChildViewController.h. Я также установил идентификатор «ячейка» в инспекторе атрибутов ячейки представления таблицы, но вот в чем дело. Поскольку я не получаю того вида, который хочу для своей ячейки, я попытался написать его с ошибкой, и ничего не изменилось, так что ясно, что идентификатор ничего не делает. Когда я запускаю свое приложение, я получаю следующее:

введите здесь описание изображения

Таким образом, загружается массив изображений и заголовков, но не фактический размер ячейки и метки, которые я установил в файле xib для ячейки. Я попытался что-то изменить в ячейке, например цвет фона в инспекторе атрибутов.

а в xib это выглядит так:

введите здесь описание изображения

но когда я запускаю его:

введите здесь описание изображения

Я предполагаю, что все это потому, что идентификатор ячейки на самом деле не связан, но я думал, что сделал это в строке:

 SimpleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

Я пропустил здесь какой-то важный код, связал что-то в xib или это просто опечатка? любые предложения высоко ценятся.

////////////////////////////////////////////////// ////////////////////ОБНОВЛЕНИЕ1////////////////////////////// ////////////////////////////////////////////

Я попробовал второе предложение, и результат таков:

введите здесь описание изображения

Итак, надеюсь, это прольет свет на то, что я делаю неправильно?

Кроме того, я исправил исходный текст, когда я меняю цвет на зеленый, он использует инспектор атрибутов.

Спасибо за вашу помощь.

////////////////////////////////////////////////// ////////////////////UPDATE2////////////////////////////// ////////////////////////////////////////////

Я удалил строки:

 cell.textLabel.text = [self.titles objectAtIndex:indexPath.row];
 cell.imageView.image = [UIImage imageNamed:[self.thumblenails objectAtIndex:indexPath.row]];

Также добавил код:

[self.tableView registerNib:[UINib nibWithNibName:@"SimpleTableCell" bundle:nil] forCellReuseIdentifier:@"cell"];

и код:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return [UIScreen mainScreen].bounds.size.width * (0.3);
}

Теперь моя таблица выглядит так:

введите здесь описание изображения

Итак, теперь возникает вопрос, как мне добавить фактические значения исходных массивов заголовков и изображений?


person Paul    schedule 01.02.2016    source источник


Ответы (2)


вы должны установить высоту ячейки, чтобы получить точно такой же вид в файле пера. используйте этот метод делегата, чтобы установить высоту ячейки.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [UIScreen mainScreen].bounds.size.width * (0.3);// 0.3 should be your aspect ratio for cell:
    // for cell.height/ cell.width in nib file.

}
person meth    schedule 01.02.2016
comment
Это дало мне странный результат, я обновлю вопрос с его изображением. - person Paul; 01.02.2016
comment
это из-за ваших ограничений. Поскольку вы не используете добавленные вами UIImageView и UILabel. вы помещаете метку в интерфейс, но используете метку и изображение, предоставленное UITableViewCell. Получите ссылку на ваше изображение и метку из конструктора интерфейса и установите их текст и изображение. возможно, они все не на своих местах. - person meth; 01.02.2016
comment
Хорошо, я сделал это, и все в порядке, но нет изображений, поскольку они объявлены как массив в ChildViewController. Было бы неплохо сделать SimpleTableViewCell.h делегатом? - person Paul; 02.02.2016
comment
Извините, я не понимаю проблемы. Что вы имеете в виду под отсутствием изображений. - person meth; 02.02.2016
comment
Извините, я имею в виду, что удалил строки: cell.textLabel.text = [self.titles objectAtIndex:indexPath.row]; cell.imageView.image = [UIImage imageNamed:[self.thumblenails objectAtIndex:indexPath.row]]; которые заполняли заголовки и изображения, но противоречили меткам (см. обновление 1). Итак, теперь, благодаря предоставленному вами коду, у меня есть правильная высота, и появляются метки (см. обновление 2), но как я могу заполнить их своими данными? огромное спасибо - person Paul; 02.02.2016
comment
вы должны создать свойства ваших меток и изображений в заголовке tableviewcell. если у вас их нет, создайте их в конструкторе интерфейсов. например, в вашем файле SimpleTableViewCell.h у вас должен быть @property (nonatomic) IBOutlet UIImageView *myImageView, который подключен к изображению вашего tableviewcell. и при заполнении таблицы вы должны написать [cell.myImageView setImage:...]. все это также должно быть сделано для этикеток. - person meth; 02.02.2016
comment
да. Большое спасибо. Лучший набор ответов. - person Paul; 02.02.2016

Вы забыли зарегистрировать nib для идентификатора ячейки. Поместите метод [self.tableView registerNib:[UINib nibWithNibName:@"SimpleTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"]; в viewDidLoad.

И вы можете удалить

if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableViewCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
person Sviatoslav Yakymiv    schedule 01.02.2016
comment
Кстати, этот ответ тоже был правильным, но я не могу назвать два ответа действительными? - person Paul; 02.02.2016