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

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
#1

Динамическое изменение количество ячеек в UITableView - Программирование iOS

21.04.2013, 16:18. Просмотров 1833. Ответов 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 и попробовать изменить - проблема повторяется. Как быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 16:18     Динамическое изменение количество ячеек в UITableView
Посмотрите здесь:
Индексация ячеек в UITableView
Сдвиг вниз ячеек/секций в UITableView
Удаление ячеек после последней секции в UITableView
TableView - изменение анимации удаления ячеек
UITableView Section Objective-C
Несуществующий UITableView
Сортировка в UITableView
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dan_banan_
10 / 10 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 16:23     Динамическое изменение количество ячеек в UITableView #2
Интересный подход ))) а массив который привязан к таблице ты заполняешься этими значениями равными количеству ячеек? я что то не пойму ты типа указал что у тебя будет теперь 6 ячеек, присвоил число 6 переменной, вернул ее и вуааля должно появиться 6 ячеек? )
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 16:33  [ТС]     Динамическое изменение количество ячеек в UITableView #3
Нет, все немного иначе. Ячейки по умолчанию пустые. В них содержится лэйбл и текстовое поле. Лэйбл указывает на номер ячейки, с помощью indexPath. Это не суть важно, я позже буду формировать массив, данные которого будут браться из этих текстовых полей. По логике (по крайней мере моей), я беру переменную, вношу в нее интовское число (не больше 20), и подставляю в numberOfRowsInSection. Я же говорю, что оно работает, но только когда изначально (т.е. перед выбором числа для переменной) количество ячеек не равняется 1.
Dan_banan_
10 / 10 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 16:46     Динамическое изменение количество ячеек в UITableView #4
потому что при обновлении таблице он лезет в массив и забирает оттуда новые данные, формируя ячейки а у тебя там ничего нет. поэтому и одна ячейка )
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 16:57  [ТС]     Динамическое изменение количество ячеек в UITableView #5
Но я же не привязываю это количество к массиву. Я его вообще даже не создавал. В методе numberOfRowsInSection какое количество на return поставишь, такое количество и построит. Верно же? Массив тут вообще пока нигде не фигурирует. Если я не правильно рассуждаю, то почему тогда потом выставляет правильное количество ячеек? !пустых ячеек с текстфилдом и лейблом с номером ячейки.
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 16:59     Динамическое изменение количество ячеек в UITableView #6
а где cellForRowAtIndexPath?
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:22  [ТС]     Динамическое изменение количество ячеек в UITableView #7
Вот он:
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), но количество ячеек нет. Как вы видите ни о каких массивах даже речь не идет.
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:29     Динамическое изменение количество ячеек в UITableView #8
tableView dequeueReusableCellWithIdentifier:CellIdentifier 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);
ОМГ зачем размер таблицы менять?
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:31  [ТС]     Динамическое изменение количество ячеек в UITableView #9
Спасибо конечно, но это не решает мою проблему.
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:34     Динамическое изменение количество ячеек в UITableView #10
В самом заполнении ячейки данными мне еще нужно указывать размер фрейма таблицы,
указывай его в numberOfRowsInSection
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
21.04.2013, 17:39  [ТС]     Динамическое изменение количество ячеек в UITableView #11
Цитата Сообщение от opi Посмотреть сообщение
В самом заполнении ячейки данными мне еще нужно указывать размер фрейма таблицы, т.к. она находится практически в середине вьюшки. Делаю это все примерно по таким же ифам, как в numberOfRowsInSection.
Необходимо для того, чтобы в ней не было скроллинга и она просто дальше сдвигала контент, который идет ниже нее. А теперь если можно, то советы и вопросы задавать по существу, т.е. то, что мне может помочь, а не как устроена вьюшка. Моя проблема не в размере, а в том что при первоначальном значении, равным 1, не изменяется с первого раза их количество. Если мне понадобятся советы по поводу указания размера, то я обязательно обращусь, но сейчас давайте вернемся к самой проблеме.
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 17:42     Динамическое изменение количество ячеек в UITableView #12
она просто дальше сдвигала контент, который идет ниже нее
это можно сделать только программно, либо через выравнивание указав к какому краю должны UIView прилипать и расширяться

и менять размер не только самой таблицы, но и ее superview
Dan_banan_
10 / 10 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 17:52     Динамическое изменение количество ячеек в UITableView #13
Чувак я кратко поясню ) для того что бы создать новые ячейки надо что бы в массиве были данные если ты хочешь что то отобразить. Ты должен это прописать в методе 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 и увеличивать размер вью или поставить якорь на растяжение вьюхи и попробывать)
perlik
38 / 38 / 1
Регистрация: 26.01.2013
Сообщений: 140
21.04.2013, 19:09     Динамическое изменение количество ячеек в UITableView #14
Пользуясь случаем передаю родному Запорожью привет )


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


- (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 айфоны все сместится непонятно куда
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 19:11     Динамическое изменение количество ячеек в UITableView #15
иначе под 3-й и 4-1 айфоны все сместится непонятно куда
под ios5 ваще вылетает с включенным autolayot
perlik
38 / 38 / 1
Регистрация: 26.01.2013
Сообщений: 140
21.04.2013, 19:13     Динамическое изменение количество ячеек в UITableView #16
Цитата Сообщение от alexpac26 Посмотреть сообщение
под ios5 ваще вылетает с включенным autolayot

Я его сразу отключаю. и иногда использую constraints. тоже хороший иснтрумент для выравнивания
Dargo
1 / 1 / 0
Регистрация: 23.04.2013
Сообщений: 10
23.04.2013, 03:02     Динамическое изменение количество ячеек в UITableView #17
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, а это не очень хорошо…
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 20:25     Динамическое изменение количество ячеек в UITableView
Еще ссылки по теме:
UITableView & UIButton
Swift Передать из UITableView в UIWebView
UITableView запутался с вьюхой
Работа с жестами в UITableView
UISearchBar & UITableView

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

Или воспользуйтесь поиском по форуму:
opi
7 / 7 / 1
Регистрация: 09.11.2010
Сообщений: 69
23.04.2013, 20:25  [ТС]     Динамическое изменение количество ячеек в UITableView #18
Спасибо всем за дельные советы и помощь, но проблема оказалась действительно смешной Дело было в размерах самой таблицы. При выборе создать 2 ячейки, оно ее на самом деле создавало, но из-за того, что я не учел при расчете размера еще и размер сепараторов, оно не отображало ее из-за нехватки 3-4 пикселей. И не мог я это проверить из-за того, что выключал скроллинг в самой таблице. Вот такая вот смешная ситуёвина получилась За остальное не переживайте - порядок в коде уже навел
Yandex
Объявления
23.04.2013, 20:25     Динамическое изменение количество ячеек в UITableView
Ответ Создать тему
Опции темы

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