Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
#1

Неизвестный объект занимает всю область ячейки UITableViewCell - Objective-C

11.09.2014, 23:14. Просмотров 872. Ответов 12
Метки нет (Все метки)

Есть класс наследованный от UITableViewController
в методе tableView:cellForRowAtIndexPath я получаю ячейку:
Objective-C
1
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
потом создаю картинку (UIImageView) и текст (UILabel) и вставляю их в ячейку с помощью addSubview

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

что это за белый объект?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 23:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неизвестный объект занимает всю область ячейки UITableViewCell (Objective-C):

The best way to calculate UITableViewCell height - Objective-C
Привет всем. Назрел довольно давний вопрос. Все мы пользуемся чудесными классами UITableViewCell, UITableView. Мне бы хотелось...

Редактирование заголовка UITableViewCell - Objective-C
Здравствуйте. Я делаю сейчас небольшое задание по Objective-C. Это обычный To-Do List. По кнопке + на новом экране создается объект...

Изменение высоты UITableViewCell - Objective-C
Нужно сделать таблицу, ячейки которой при нажатии расширяются по высоте и меняют положение картинки и текста как на картинке. Почитал про...

Отображение UITableViewCell в UIStoryboard - Objective-C
Всем доброго времени суток, меня интересует вопрос: как выводить ячейки в Objective-C я создал 10 ячеек, но вывел только 1 как вывести...

Изображение перед uitableviewcell как? - Программирование iOS
Здравствуйте. Как добавить изображение перед ячейками? Скрин: http://prntscr.com/14kpgp Двигаю ячейки и выше их идет изображение....

Работа с кастомными UITableViewCell и MVC - Программирование iOS
Всем привет! У меня есть привычка при работе со своими кастомными ячейками делать так: Допустим, есть ячейка, отображающая данные...

12
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
12.09.2014, 00:31 #2
Скриншот был бы очень кстати.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 00:49  [ТС] #3
сделал разные высоты ячеек, белая область всегда на всю ячейку
0
Миниатюры
Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell  

edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
12.09.2014, 01:17 #4
Покажите ваш метод tableView:cellForRowAtIndexPath
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 11:31  [ТС] #5
вот tableView:cellForRowAtIndexPath, я в нём вызываю ещё один метод так как будут разные типы ячеек
Кликните здесь для просмотра всего текста

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //
    NSLog(@"Вызван метод NewsMainViewController::cellForRowAtIndexPath");
    //
    static NSString *CellIdentifier = @"Cell Identifier";
    // Создаём указатель на ячейку
    NewsTableViewCell *cell = nil;
    //
    [tableView registerClass:[NewsTableViewCell class] forCellReuseIdentifier:CellIdentifier];
    //
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    // Если это наша таблица
    if ([tableView isEqual:self.tableView])
    {
        //
        if (indexPath.section == 0 && indexPath.row == 0)
        {
            //
            cell = [self tableView: tableView cellMainNews: cell ForRowAtIndexPath:indexPath];
        }
    }
    // Возвращаем указатель на объект ячейки
    return cell;
}
 
 
// Метод создаёт ячейку с главной новостью на главной странице
- (NewsTableViewCell *)tableView:(UITableView *)tableView cellMainNews: (NewsTableViewCell *)cell ForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Высота картинки
    CGFloat imageHeight = 0;
    // Если есть картинка новости
    if (self.model.newsMainItem.image != nil)
    {
        // Вычисляем ширину картинки по ширине таблицы
        CGFloat imageWidh = self.tableView.contentSize.width;
        // Вычисляем пропорциональную высоту картинки
        imageHeight = self.tableView.contentSize.width / self.model.newsMainItem.image.size.width * self.model.newsMainItem.image.size.height;
        // Создаём объект представления картинки
        cell.image.frame = CGRectMake(0, 0, imageWidh, imageHeight);
        // Устанавливаем масштабирование картинки
        cell.image.contentMode = UIViewContentModeScaleAspectFill;
        // Устанвливаем картинку
        cell.image.image = self.model.newsMainItem.image;
    }
    else
    {
        // Загружаем картинку
        [self.model.newsMainItem loadImage];
    }
    // Высота заголовка
    CGFloat titleLabelHeight = 0;
    // Устанавливаем текст заголовка
    cell.title.text = self.model.newsMainItem.title;
    //
    titleLabelHeight = [self expectedLabelSize:cell.title maximumLabelSize:CGSizeMake(320, 640)];
    //
    cell.title.frame = CGRectMake(0, imageHeight, 320, titleLabelHeight);
    // Высота заголовка
    CGFloat createdLabelHeight = 0;
    // Устанавливаем текст заголовка
    cell.created.text = self.model.newsMainItem.created;
    //
    createdLabelHeight = [self expectedLabelSize:cell.created maximumLabelSize:CGSizeMake(320, 640)];
    //
    cell.created.frame = CGRectMake(0, imageHeight + titleLabelHeight, 320, createdLabelHeight);
    // Возвращаем указатель на объект ячейки
    return cell;
}
а это переопределённый метод класса NewsTableViewCell
Кликните здесь для просмотра всего текста

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    //
    NSLog(@"Вызван метод NewsTableViewCell::initWithStyle");
    //
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    //
    self.image = [[UIImageView alloc] init];
    // Добавляем картинку в ячейку
    [self addSubview:self.image];
    //
    self.title = [[UILabel alloc] init];
    //
    self.title.numberOfLines = 0;
    // Добавляем загловок в ячейку
    [self addSubview:self.title];
    //
    self.created = [[UILabel alloc] init];
    //
    self.title.numberOfLines = 0;
    // Добавляем дату создания в ячейку
    [self addSubview:self.created];
    //
    return self;
}


Добавлено через 10 часов 6 минут
если надо я могу сократить код tableView:cellForRowAtIndexPath до нескольких строк
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
12.09.2014, 13:29 #6
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
    //
    //static NSString *CellIdentifier = @"Cell Identifier"; // << статик не требуется
    // Создаём указатель на ячейку // << 
    
    
    NewsTableViewCell *cell = nil;
    //
    //[tableView registerClass:[NewsTableViewCell class] forCellReuseIdentifier:CellIdentifier]; 
    // << регистрация требуется только для UICollectionView , для таблицы это писать не нужно
    //
    
    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell Identifier" forIndexPath:indexPath]; 
   // <<  если ячейка находится на сториборде то этого кода достаточно для инициализации экземпляра ячейки
    
    
    // Если это наша таблица
    if (tableView  == self.tableView) // << UIview объекты сравниваются через == равенство
    {
        //
        if (indexPath.section == 0 && indexPath.row == 0)
        {
            //
            cell = [self tableView: tableView cellMainNews: cell ForRowAtIndexPath:indexPath];
        }
    }
    // Возвращаем указатель на объект ячейки
    return cell;
}
Добавлено через 5 минут
Может пригодится пример программного рассчета высот текста в таблицах

http://www.imaladec.com/forum/index....post__p__11740
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:03  [ТС] #7
сториборда у меня нет
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
12.09.2014, 14:05 #8
еще скажите что *.xib ячейки тоже нет.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:30  [ТС] #9
xib - тоже нет
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
12.09.2014, 14:31 #10
тогда на кофейной гуще гадать будет сложно.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:31  [ТС] #11
у меня в ячейке всего три элемента: картинка и два текста
я хочу их программно создать и разместить на ячейке
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
12.09.2014, 14:44 #12
тогда не в конструкторе initWithStyle

Инициализацию UView компонентов лучше делать в didMoveToSuperView:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
-(void)didMoveToSuperview {
    if (self.tag == 0 && self.tag++ == 0) {
        
       UIView *z = [[UIView alloc] initWithFrame: CGRectMake(0,0,50,50)];
       z.backgroundColor = [UIColor redColor];
       
       [self.contentView addSubview: z];
 
    } // end init
 
}
Добавлено через 5 минут
кстати еще грубая ошибка.
У ячеек нужно вьюшки добавлять на .contentView а не на саму ячейку
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 16:30  [ТС] #13
Инициализацию UView компонентов лучше делать в didMoveToSuperView
инициализация должна выполняться только один раз или при каждом обновлении таблицы?

Добавлено через 36 минут
проблема белого прямоугольника решена
после загрузки картинки я использовал:
Objective-C
1
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
я думал что это тоже самое что:
Objective-C
1
[self.tableView reloadData];
но только для одной ячейки

но оказалось что reloadRowsAtIndexPaths заново вызывает инициализацию ячейки, а tableView reloadData вызывает prepareForReuse
0
12.09.2014, 16:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2014, 16:30
Привет! Вот еще темы с ответами:

Кастомная UITableViewCell как в iMessage - Objective-C
Целый день мучаюсь с кастомной ячейкой. Решил начать с нуля. Хочу создать ячейку на подобии как в iMessage. Но сразу возникает вопрос -...

Если создать объект Graphics в модуле или в форме, то картинка прорисовывается не на всю область видимости - Visual Basic .NET
Здравствуйте, если создать объект Graphics в модуле или в форме, то картинка прорисовывается не на всю область видимости (будь то рисование...

Svchost занимает всю оперативную память - Удаление вирусов
процесс занимает больше половины оперативки, иногда вся система замирает на секунд 10, даже мышка не двигается. раньше такого не замечал

В мобильной версии body не занимает всю ширину - HTML, CSS
Начал делать мобильную версию сайта (первый раз), использую инструмент разработчика встроенный в хром, который выставляет разрешение как на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru