Табличное представление viewWithTag не получает UIElements target-c
Я делаю с использованием некоторого кода, который я видел работу раньше. По сути, пользователь отвечает "да" или "нет" на сообщение несколькими кнопками. Нажатие "да" или "нет" обновляет базу данных, которая работает правильно, а также обновляет видимый пользовательский интерфейс, который не работает. Этот пользовательский интерфейс обновляет кнопки, так что они выбираются одна, другая подсвечивается, и обе отключены для взаимодействия с пользователем. Также он вносит изменения в две UILabels. Метод, который вызывает эти кнопки, должен обновить базу данных, извлечь кнопки из tableViewCell и обновить изменения. У меня есть методы, работающие в другом ViewController, поэтому я не могу понять разницу здесь. Вот мой cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *simpleTableIdentifier = [NSString stringWithFormat:@"%ld,%ld",(long)indexPath.section,(long)indexPath.row];
NSLog(@" simple: %@",simpleTableIdentifier);
if (indexPath.row==0) {
ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:simpleTableIdentifier];
}
cell = [self createProfileCell:cell];
return cell;
}else{
YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell==nil) {
cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
cell = [self createYesNoCell:cell:indexPath];
return cell;
}
}
По сути, это создает профиль пользователя в первой ячейке и загружает все вопросы, которые задает пользователь. Это основное различие, которое я вижу между старым tableView и этим tableView. В createYesNoCell я создаю UIElements и создаю теги следующим образом
cell.yesVoteButton.tag=indexPath.row+ yesVoteButtonTag1;
cell.noVoteButton.tag=indexPath.row+ noVoteButtonTag1;
cell.yesCountLabel.tag=indexPath.row+ yesCountLabelTag1;
cell.noCountLabel.tag=indexPath.row+ noCountLabelTag1;
Кнопки имеют селектор, который запускает несколько вещей. Он находит, какая кнопка была нажата следующим.
NSInteger index;
if(sender.tag>=yesVoteButtonTag1){
NSLog(@"Yes button pressed");
votedYes=true;
index=sender.tag-yesVoteButtonTag1;
}else{
NSLog(@"No button Pressed");
votedYes=false;
index=sender.tag-noVoteButtonTag1;
}
UILabel *yesLabel = (UILabel*) [self.tableView viewWithTag:index+yesCountLabelTag1]; // you get your label reference here
UIButton *yesButton=(UIButton *)[self.tableView viewWithTag:index+1+yesVoteButtonTag1];
NSLog(@"Tag IN METHOD: %ld",index+yesVoteButtonTag1);
UILabel *noLabel = (UILabel*) [self.tableView viewWithTag:index+1+noCountLabelTag1]; // you get your label reference here
UIButton *noButton=(UIButton *)[self.tableView viewWithTag:index+noVoteButtonTag1];
Эти вызовы viewWithTag равны нулю, когда я смотрю на них. Единственное отличие, которое я вижу из моей более ранней реализации, состоит в том, что в старой версии были разделы и одна строка, в то время как эта - все строки и один раздел. Поэтому замена indexPath.section на indexPath.row должна учитывать это. Также я проверил, что тег, созданный в cellForRowAtIndexPath, совпадает со строкой, восстановленной в методе голосования "да / нет", потому что он смещается на единицу из-за того, что ячейка профиля создается в indexPath.row==0. Я попытался передать ячейку в метод голосования "да / нет" и попытался восстановить кнопки и метки с помощью contentView, как некоторые предложения, сделанные в похожих постах. Однако, похоже, это не решило мою проблему. Действительно был бы признателен за понимание этого.
3 ответа
Если вы вызываете метод [tableView reload] для обновления UITableView, это может помочь.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"YOURCELL_IDENTIFIER";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
UILabel *title = (UILabel*) [cell viewWithTag:5];
UILabel *vensu =(UILabel*) [cell viewWithTag:7];
vensu.text = @"YOUR TEXT";
title.text = @"YOUR TEXT";
return cell;
}
Во-первых, идентификатор повторного использования таблицы должен использоваться для типов ячеек, а не один для каждой ячейки. У вас есть два типа, поэтому вы должны использовать два фиксированных идентификатора повторного использования.
ProfileFirstCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"ProfileCell"];
if (cell == nil) {
cell = [[ProfileFirstCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"ProfileCell"];
}
а также
YesNoCell *cell =[self.tableView dequeueReusableCellWithIdentifier:@"YesNoCell"];
if (cell==nil) {
cell=[[YesNoCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"YesNoCell"];
}
Во-вторых, вместо того, чтобы пытаться получить ссылку на ячейку после создания таблицы, которая вам не подходит, вы должны полностью инициализировать ячейки при их создании. (TableView не будет создавать ячейки, если они не видны, поэтому вам не следует полагаться на их существующие).
createProfileCell
действительно должен называться initializeProfileCell
потому что вы не создаете ячейку в ней - вы уже сделали это в строке выше или восстановили старую.
Тогда ваш звонок initializeProfileCell
может взять флаг, указывающий, является ли это ячейкой Да или Нет, и соответственно установить его свойства.
cell = [self initializeProfileCell:cell isYes:(indexPath.section==0)];
Аналогично с createYesNoCell
-> initializeYesNoCell
,