Форум программистов, компьютерный форум, киберфорум
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69

Динамическое изменение количество ячеек в UITableView

21.04.2013, 16:18. Показов 4603. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Столкнулся с проблемой. Добавил таблицу на обычный вьюконтроллер, вроде все нормально настроил, указал делегат, датасурс. Изначально таблица имеет лишь 1 ячейку. Есть метод, который, грубо говоря, указывает на количество ячеек в этой таблице с помощью пикервью. То есть при выборе числа из этого списка, должно формироваться соответствующее число ячеек. При подтверждении выбора я заношу в переменную это значение и даю команду на обновление таблицы.:
Objective-C
1
2
3
4
- (void)didSelectItem:(id)item {
    stepsValue = [item intValue];
    [tableView reloadData];
}
Метод numberOfRowsInSection выглядит таким образом:
Objective-C
1
2
3
4
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (stepsValue == 0) return 1;
    else return stepsValue;
}
В самом заполнении ячейки данными мне еще нужно указывать размер фрейма таблицы, т.к. она находится практически в середине вьюшки. Делаю это все примерно по таким же ифам, как в numberOfRowsInSection.
Вроде бы все правильно и оно даже работает, но на половину. Если количество ячеек равняется 1, то количество может измениться только если сделать выбор дважды. Но а размер таблицы (определяю по фону) изменяется как нужно.

То есть сам процесс примерно выглядит так:
1. Загружается вью - 1 ячейка;
2. Выбираю количество ячеек - остается все равно 1 ячейка, но изменяется размер (Как по идее и должен);
3. Выбираю повторно (можно даже любое другое, кроме 1) - срабатывает все как нужно.

Если обратно поставить на 1 и попробовать изменить - проблема повторяется. Как быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2013, 16:18
Ответы с готовыми решениями:

Динамическое изменение цвета фона ячеек
Здравствуйте. Собственно озадачился недавно созданием сайта но в html полный нуб. Код пишу при помощи DreamWeaver, самоучителя и интернета....

Динамическое изменение индекса ячеек в Excel
Доброго времени суток. Вкратце суть проблемы. Есть 9 чекбоксов. Есть 9 макетов в одном листе екселе в столбик. Запись производится...

Динамическое изменение ссылок на листы с ячеек
есть ячейка с данными например 1.4 и такой же лист '1.4' можно привязать ссылкой но при изменение значения на 1.5 ссылка остается привязана...

17
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 16:23
Интересный подход ))) а массив который привязан к таблице ты заполняешься этими значениями равными количеству ячеек? я что то не пойму ты типа указал что у тебя будет теперь 6 ячеек, присвоил число 6 переменной, вернул ее и вуааля должно появиться 6 ячеек? )
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 16:33  [ТС]
Нет, все немного иначе. Ячейки по умолчанию пустые. В них содержится лэйбл и текстовое поле. Лэйбл указывает на номер ячейки, с помощью indexPath. Это не суть важно, я позже буду формировать массив, данные которого будут браться из этих текстовых полей. По логике (по крайней мере моей), я беру переменную, вношу в нее интовское число (не больше 20), и подставляю в numberOfRowsInSection. Я же говорю, что оно работает, но только когда изначально (т.е. перед выбором числа для переменной) количество ячеек не равняется 1.
0
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 16:46
потому что при обновлении таблице он лезет в массив и забирает оттуда новые данные, формируя ячейки а у тебя там ничего нет. поэтому и одна ячейка )
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 16:57  [ТС]
Но я же не привязываю это количество к массиву. Я его вообще даже не создавал. В методе numberOfRowsInSection какое количество на return поставишь, такое количество и построит. Верно же? Массив тут вообще пока нигде не фигурирует. Если я не правильно рассуждаю, то почему тогда потом выставляет правильное количество ячеек? !пустых ячеек с текстфилдом и лейблом с номером ячейки.
0
 Аватар для alexpac26
14 / 22 / 4
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 16:59
а где cellForRowAtIndexPath?
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:22  [ТС]
Вот он:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    static NSString *CellIdentifier = @"StepsListCell";
 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
 
    float tableViewHeight;
    if (stepsValue == 0) tableViewHeight = 44;
    else tableViewHeight = 44 * stepsValue;
    tableView.frame = CGRectMake(tableView.frame.origin.x tableView.frame.origin.y, tableView.frame.size.width, tableViewHeight);
 
    UILabel *stepsCountLabel = (UILabel *)[cell viewWithTag: 100];
    [stepsCountLabel setText: [NSString stringWithFormat:@"%i.", (indexPath.row + 1)]];
    
   return cell;
}
И по такой схеме размер генерируется нормально (даже при 1), но количество ячеек нет. Как вы видите ни о каких массивах даже речь не идет.
0
 Аватар для alexpac26
14 / 22 / 4
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:29
tableView dequeueReusableCellWithIdentifier:CellId entifier forIndexPath:indexPath
на сколько я помню forIndexPath указывать не обязательно достаточно
Objective-C
1
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
tableView.frame = CGRectMake(tableView.frame.origin.x tableView.frame.origin.y, tableView.frame.size.width, tableViewHeight);
ОМГ зачем размер таблицы менять?
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:31  [ТС]
Спасибо конечно, но это не решает мою проблему.
0
 Аватар для alexpac26
14 / 22 / 4
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:34
В самом заполнении ячейки данными мне еще нужно указывать размер фрейма таблицы,
указывай его в numberOfRowsInSection
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:39  [ТС]
Цитата Сообщение от opi Посмотреть сообщение
В самом заполнении ячейки данными мне еще нужно указывать размер фрейма таблицы, т.к. она находится практически в середине вьюшки. Делаю это все примерно по таким же ифам, как в numberOfRowsInSection.
Необходимо для того, чтобы в ней не было скроллинга и она просто дальше сдвигала контент, который идет ниже нее. А теперь если можно, то советы и вопросы задавать по существу, т.е. то, что мне может помочь, а не как устроена вьюшка. Моя проблема не в размере, а в том что при первоначальном значении, равным 1, не изменяется с первого раза их количество. Если мне понадобятся советы по поводу указания размера, то я обязательно обращусь, но сейчас давайте вернемся к самой проблеме.
0
 Аватар для alexpac26
14 / 22 / 4
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:42
она просто дальше сдвигала контент, который идет ниже нее
это можно сделать только программно, либо через выравнивание указав к какому краю должны UIView прилипать и расширяться

и менять размер не только самой таблицы, но и ее superview
0
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 17:52
Чувак я кратко поясню ) для того что бы создать новые ячейки надо что бы в массиве были данные если ты хочешь что то отобразить. Ты должен это прописать в методе cellForRowAtIndexPath. что мол если моя ячейка равно нилу то ее надо создать. А как создать? забираешь из МАССИВА обьект по indexPath.Row и создаешь ячейку) Допустим у тебя обьект типа студенты которые хранятся в массиве. у этик обьектов есть поля имя студента и фамилия. А у тебя есть ячейка с двумя label. Одно для отображения имени а другое для фамилии , и называются они nameLabel и surname.Label. тогда тебе надо написать так
Objective-C
1
2
3
4
5
6
7
8
9
if (cell == nil)
    {
   
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }
      Student *student = [array objectAtIndex: IndexPath.row];
      cell.nameLabel = student.name;
      cell.surname = student.surname;
      return cell;
Добавлено через 1 минуту
и логично наверно предположить что что бы получить обьет из массива и отобразить ячейку надо сначала его туда положить до обновления таблицы) если ты хочешь меня количество ячеек тогда будь добр чисти массив удаляй соот обьекты или добавляй. Зачем придумывать костыли))

Добавлено через 3 минуты
что бы не было скролинга надо просто отключить его в tableview и увеличивать размер вью или поставить якорь на растяжение вьюхи и попробывать)
0
38 / 38 / 0
Регистрация: 26.01.2013
Сообщений: 140
21.04.2013, 19:09
Пользуясь случаем передаю родному Запорожью привет )


вот мой код. правда заполняю данные через массив


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

return [_news count]; //тут можешь написать return 20 или 2000000 как тебе понравится )
}


//cells create
- (UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath {

static NSString *const CellId = @"CellNews";

DetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellId];

lastNews *item = [_news objectAtIndex : indexPath.row];
cell.titleLabel.text = item.title;


[self doAnim:cell];// это моя анимация тебе это не нужно :-)

return cell;
}


соотвественно если ты создаешь свою кастомную ячейку ты должен создать для нее отдельный класс который заимствует у UITableViewCell и присвоить ячейке новый класс (через инспектор)

так же создать обхект IBOutlet UITableView *tableView привязать его к viewcontroller твоему.

Добавлено через 5 минут
Цитата Сообщение от Dan_banan_ Посмотреть сообщение
что бы не было скролинга надо просто отключить его в tableview и увеличивать размер вью или поставить якорь на растяжение вьюхи и попробывать)

это обязательно настроить не забыв отключить use autolayout

иначе под 3-й и 4-1 айфоны все сместится непонятно куда
0
 Аватар для alexpac26
14 / 22 / 4
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 19:11
иначе под 3-й и 4-1 айфоны все сместится непонятно куда
под ios5 ваще вылетает с включенным autolayot
0
38 / 38 / 0
Регистрация: 26.01.2013
Сообщений: 140
21.04.2013, 19:13
Цитата Сообщение от alexpac26 Посмотреть сообщение
под ios5 ваще вылетает с включенным autolayot

Я его сразу отключаю. и иногда использую constraints. тоже хороший иснтрумент для выравнивания
0
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
23.04.2013, 03:02
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
- (void)validateFrameForTableView:(UITableView *)tableView
{
    float tableViewHeight;
    if (stepsValue == 0) tableViewHeight = 44;
    else tableViewHeight = 44 * stepsValue;
    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y, tableView.frame.size.width, tableViewHeight);
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    static NSString *CellIdentifier = @"StepsListCell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    
    [self validateFrameForTableView:tableView];
    
    // а очень нужна эта лейба? Нельзя использовать родную, и если нужна, то где она добавляется на Cell?
    /*UILabel *stepsCountLabel = (UILabel *)[cell viewWithTag: 100];
    [stepsCountLabel setText: [NSString stringWithFormat:@"%i.", (indexPath.row + 1)]];*/
    
    cell.textLabel.text = [NSString stringWithFormat:@"%i.", (indexPath.row + 1)];
    
    return cell;
}
А если так?
И я бы validateFrameForTableView: вызывал в том методе, где ты устанавливаешь stepsValue. Иначе фрейм высчитывается и устанавливается каждый раз, как вызывается метод - (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath, а это не очень хорошо…
0
8 / 8 / 2
Регистрация: 09.11.2010
Сообщений: 69
23.04.2013, 20:25  [ТС]
Спасибо всем за дельные советы и помощь, но проблема оказалась действительно смешной Дело было в размерах самой таблицы. При выборе создать 2 ячейки, оно ее на самом деле создавало, но из-за того, что я не учел при расчете размера еще и размер сепараторов, оно не отображало ее из-за нехватки 3-4 пикселей. И не мог я это проверить из-за того, что выключал скроллинг в самой таблице. Вот такая вот смешная ситуёвина получилась За остальное не переживайте - порядок в коде уже навел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2013, 20:25
Помогаю со студенческими работами здесь

Индексация ячеек в UITableView
Здравствуйте, скажите пожалуйста как решить проблему: у меня в UITableView есть несколько секций, в каждой и которых различное количество...

Сдвиг вниз ячеек/секций в UITableView
Доброго времени суток. Мне необходимо реализовать такую задачу: есть таблица, по тапу на одну ячейку все остальные ячейки, которые ниже,...

Удаление ячеек после последней секции в UITableView
Доброго времени суток. У меня есть Table View с 4мя секциями. Иногда из 4х секций может быть видна только одна, последняя. Она шириной в...

Определить количество информационных ячеек, проверочных ячеек и всего ячеек
В груповой код внесена двукратная ошибка. Передается 128 сообщений. Определить количество информационных ячеек, проверочных ячеек и всего...

Изменение цвета двух ячеек при изменении данных двух других ячеек
Всем привет! Нужна помощь. Вопрос такой: Есть два столбца А и В и два зависимых от них столбцы C и D. В столбце C и D уже введены те...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru