Форум программистов, компьютерный форум CyberForum.ru

Objective-C

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

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

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

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

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

что это за белый объект?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 23:14     Неизвестный объект занимает всю область ячейки UITableViewCell
Посмотрите здесь:
Редактирование заголовка UITableViewCell Objective-C
Изменение высоты UITableViewCell Objective-C
Objective-C Отображение UITableViewCell в UIStoryboard
Objective-C The best way to calculate UITableViewCell height
Кастомная UITableViewCell как в iMessage Objective-C
Если создать объект Graphics в модуле или в форме, то картинка прорисовывается не на всю область видимости Visual Basic .NET
Svchost занимает всю оперативную память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 391
12.09.2014, 00:31     Неизвестный объект занимает всю область ячейки UITableViewCell #2
Скриншот был бы очень кстати.
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 00:49  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #3
сделал разные высоты ячеек, белая область всегда на всю ячейку
Миниатюры
Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell  

edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 391
12.09.2014, 01:17     Неизвестный объект занимает всю область ячейки UITableViewCell #4
Покажите ваш метод tableView:cellForRowAtIndexPath
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 11:31  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #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 до нескольких строк
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
12.09.2014, 13:29     Неизвестный объект занимает всю область ячейки UITableViewCell #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
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:03  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #7
сториборда у меня нет
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
12.09.2014, 14:05     Неизвестный объект занимает всю область ячейки UITableViewCell #8
еще скажите что *.xib ячейки тоже нет.
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:30  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #9
xib - тоже нет
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
12.09.2014, 14:31     Неизвестный объект занимает всю область ячейки UITableViewCell #10
тогда на кофейной гуще гадать будет сложно.
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:31  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #11
у меня в ячейке всего три элемента: картинка и два текста
я хочу их программно создать и разместить на ячейке
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 583
12.09.2014, 14:44     Неизвестный объект занимает всю область ячейки UITableViewCell #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 а не на саму ячейку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2014, 16:30     Неизвестный объект занимает всю область ячейки UITableViewCell
Еще ссылки по теме:
C# Узнать сколько занимает памяти объект.
Как преобразовать объект в заранее неизвестный тип C#
Как узнать сколько байтов в памяти занимает объект? Java
Как узнать кто занимает кто потребляет всю ширину канала
C# Растянуть контрол на всю клиентскую область

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

Или воспользуйтесь поиском по форуму:
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 16:30  [ТС]     Неизвестный объект занимает всю область ячейки UITableViewCell #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
Yandex
Объявления
12.09.2014, 16:30     Неизвестный объект занимает всю область ячейки UITableViewCell
Ответ Создать тему
Опции темы

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