Пользовательская ячейка UITableView сбрасывает содержимое ячейки - PullRequest
0 голосов
/ 20 июля 2009

Хорошо, я знаю, что я сталкиваюсь с моими пределами понимания относительно цели-c, какао, xcode, и бла-бла и так далее. Но вот что я пытаюсь сделать:

У меня есть табличное представление в viewcontroller. Делегатом табличного представления является viewcontroller. Viewcontroller имеет выход к табличному виду. Таблица составляется с использованием пользовательских ячеек (с IB XIB) и данных из XML-файла. В пользовательской ячейке есть две кнопки - и когда ячейка создана, действие кнопки добавляется в качестве addTarget для себя (viewcontroller), которое затем переходит к действию. Метод действия кнопки viewcontroller возвращает строку кнопки, нажатой в таблице, а затем изменяет текст ячейки и заголовок кнопки.

Но, конечно, когда я прокручиваю эту конкретную ячейку из поля зрения и снова в поле зрения, она сбрасывается в начальное состояние. Я предполагаю, что это связано с вытеснением клеток и т. Д. Есть идеи?

вот соответствующие биты и код:

Пользовательская ячейка: имеет выходы для кнопок и надписи.

код создания ячейки в источнике данных cellForRowAtIndexPath ... {

static NSString *dialogueCellIdentifier = @"dialogueCellIdentifier";

dialogue_cell *cell = (dialogue_cell *)[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier];

if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"dialogue_cell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
    [[cell lButton] addTarget:self action:@selector(lButtonPressed:) forControlEvents:UIControlEventTouchUpInside];     
}

[[cell lButton] setTag:[indexPath row]];

NSString *row = [NSString stringWithFormat:@"%i",[indexPath row]];  
NSString *en = [[self.dataArray objectForKey:row] valueForKey:@"en"];

cell.mainText.text = en;


return cell;
}

и метод lButton ...

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath];
NSString *row = [NSString stringWithFormat:@"%i",[sender tag]];
if ([thisCell.languageButton.currentTitle isEqualToString:@"en"]) {
    [thisCell.languageButton setTitle:@"zc" forState:UIControlStateNormal];
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_zc"];
} else {
    [thisCell.languageButton setTitle:@"en" forState:UIControlStateNormal];
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_en"];        
}

так два вопроса:
1. есть ли способ заставить ячейку сохранять то, что находится в метке и имени кнопки, даже если она прокручивается за пределами экрана?
2. есть ли способ установить метку и имя кнопки в пользовательском классе ячейки вместо отправки действия кнопки контроллеру представления, в котором находится таблица?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 июля 2009

Это на самом деле не имеет ничего общего с удалением из очереди ячеек, но данными, которые вы отображаете в cellForRowAtIndexPath. Каждый раз, когда будет отображаться ячейка, вызывается этот метод.

Я предполагаю, что вы меняете язык текста ячейки при нажатии кнопки. Но каждый раз, когда ячейка перерисовывается, вы снова отображаете текст на английском языке. Один из способов «сохранить» состояние ячейки - создать массив для языков, используемых в каждой ячейке, и на основе значения массива для конкретной строки заполнить текст ячейки. Вам просто нужно будет поддерживать состояние ячейки в массиве.

0 голосов
/ 20 июля 2009

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

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath];

Когда ячейка находится вне представления, табличное представление выгружает эту ячейку, и вместо этого вы получаете ячейку, которая находится в исходном состоянии (или почти нулевой), когда вы вызываете это, потому что это не более длинная часть табличного представления, пока ячейки не будут отображаться. вернуться на экран просмотра.

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

cell=[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier];

Это даст вам вашу ячейку с состоянием, в котором она находилась, когда пользователь ее изменил ... Надеюсь, это поможет! Что касается вашего второго вопроса, вы можете просто установить целевую ячейку вместо контроллера представления, это вызовет это действие внутри вашего пользовательского класса ячеек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...