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

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

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

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

21.04.2013, 16:18. Просмотров 2075. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 16:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамическое изменение количество ячеек в UITableView (Программирование iOS):

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

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

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

TableView - изменение анимации удаления ячеек - Программирование iOS
Всем привет! Есть такая ситуация: Заказчик приложения возмущен новой анимацией удаления ячеек в iOS7 и хочет, "чтобы было, как...

Несуществующий UITableView - Программирование iOS
Добрый вечер. Столкнулся с такой проблемой: создал простое приложение с UITableView. делал по уроку, все как положено. В момент запуска...

Сортировка в UITableView - Программирование iOS
Добрый день. Во время разработки столкнулся с необходимостью сортировки, а так же связанным с ней багом. Обо всем по порядку. 1....

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

и менять размер не только самой таблицы, но и ее superview
0
Dan_banan_
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
21.04.2013, 17:52 #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 и увеличивать размер вью или поставить якорь на растяжение вьюхи и попробывать)
0
perlik
38 / 38 / 1
Регистрация: 26.01.2013
Сообщений: 140
21.04.2013, 19:09 #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 айфоны все сместится непонятно куда
0
alexpac26
14 / 22 / 0
Регистрация: 20.01.2013
Сообщений: 125
21.04.2013, 19:11 #15
иначе под 3-й и 4-1 айфоны все сместится непонятно куда
под ios5 ваще вылетает с включенным autolayot
0
21.04.2013, 19:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 19:11
Привет! Вот еще темы с ответами:

UITableView & UIButton - Программирование iOS
Доброго времени суток. Возник вопрос у меня есть таблица с 3-мя ячейками мне нужно при выборе ячейки менять Title кнопки на тот текст...

Передать из UITableView в UIWebView - Swift
Всем привет! Являюсь новичком Swift. Помогите, пожалуйста, передать данные из UITableView в UIWebView таким образом: lesson 1 ->...

UITableView запутался с вьюхой - Программирование iOS
Коллеги что-то я запутался. Есть storyboard, в нем UIViewController с UITableView. Из таблички UI элементов перетягиваю UIView... его можно...

UISearchBar & UITableView - Программирование iOS
Доброго времени суток вопрос. Переделываю приложение под iOS 7 добавил поиск по таблице но он открывает файлы по индексу ячейки, а не по...


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

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

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