Первый и последний UITableViewCell постоянно меняются при прокрутке - PullRequest
2 голосов
/ 08 января 2011

У меня есть tableView с ячейками, содержащими один UITextField в качестве подпредставления для каждой ячейки. Моя проблема в том, что при прокрутке вниз текст в первой ячейке дублируется в последней ячейке. Я не могу на всю жизнь, если я пойму, почему. Я попытался загрузить ячейки из разных перьев, имея textFields как ivars. UITextFields, похоже, не является проблемой, я думаю, это как-то связано с повторным использованием tableView ячеек.

Все текстовые поля имеют источник данных, который отслеживает текст в текстовом поле, и текст сбрасывается при каждом отображении ячейки.

Есть идеи? Буду очень признателен за ответы на этот вопрос.

ОБНОВЛЕНИЕ 2: Это код, который у меня есть для пользовательской ячейки, называемой JournalCell. Очень ценю обратную связь.

У меня 8 секций по 1 строке в каждой. Первые 7 содержат текстовое поле, а последняя представляет собой ячейку, действующую как кнопка.

Я проверяю ячейку кнопки, если она совпадает с разделом (7), то она возвращает эту ячейку, если нет, она продолжает до остальных. Может ли это быть так?

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

NSLog(@"Section %i, Row %i", indexPath.section, indexPath.row);


if (indexPath.section == 7) {

    static NSString *ButtonCellIdentifier = @"ButtonCellIdentifier";

    UITableViewCell *buttonCell = [self.tableView dequeueReusableCellWithIdentifier:ButtonCellIdentifier];

    if (buttonCell == nil) {
        buttonCell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ButtonCellIdentifier] autorelease];
        buttonCell.selectionStyle = UITableViewCellSelectionStyleBlue;
        buttonCell.accessoryType = UITableViewCellAccessoryNone;
        buttonCell.textLabel.text = sClearAll;
        buttonCell.textLabel.textAlignment = UITextAlignmentCenter;
        buttonCell.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.8];
        buttonCell.textLabel.backgroundColor = [UIColor clearColor];
    }

    return buttonCell;
}

static NSString *TextCellIdentifier = @"JournalCellIdentifier";

JournalCell *cell = (JournalCell *)[self.tableView dequeueReusableCellWithIdentifier:TextCellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"JournalCell" owner:self options:nil];
    cell = customCell;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.accessoryType = UITableViewCellAccessoryNone;

    cell.textField.autocapitalizationType = UITextAutocapitalizationTypeWords;
    cell.textField.returnKeyType = UIReturnKeyNext;
    cell.textField.clearButtonMode = UITextFieldViewModeWhileEditing;
} 

switch (indexPath.section) {
    case 0:
        switch (indexPath.row) {
            case 0:
                cell.textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
                self.authorTextField = cell.textField;
                self.authorTextField.text = [self.textFieldDictionary objectForKey:@"author"];
                NSLog(@"Reading Author:%@", [self.textFieldDictionary objectForKey:@"author"]);
                break;
        }
        break;

    case 1:
        switch (indexPath.row) {
            case 0:
                self.yearTextField = cell.textField;
                self.yearTextField.text = [self.textFieldDictionary objectForKey:@"year"];
                NSLog(@"Reading Year:%@", [self.textFieldDictionary objectForKey:@"year"]);
                break;                  
        }
        break;

    case 2:
        switch (indexPath.row) {
            case 0:
                self.volumeTextField = cell.textField;
                self.volumeTextField.text = [self.textFieldDictionary objectForKey:@"volume"];
                NSLog(@"Reading Volume:%@", [self.textFieldDictionary objectForKey:@"volume"]);
                break;                      
        }
        break;

    case 3:
        switch (indexPath.row) {
            case 0:
                self.articleTextField = cell.textField;
                self.articleTextField.text = [self.textFieldDictionary objectForKey:@"article"];
                NSLog(@"Reading Article:%@", [self.textFieldDictionary objectForKey:@"article"]);
                break;          
        }
        break;

    default:
        break;
}

return cell;

}

Ответы [ 4 ]

4 голосов
/ 17 февраля 2011

Как вы уже догадались, проблема, скорее всего, связана с обычным повторным использованием ячеек в UITableView.Создайте NSMutableDictionary как свойство вашего класса, и всякий раз, когда UITextField заканчивает редактирование, присвойте ему значение в качестве ключа в вашем словаре.

Затем, в вашем методе cellForRowAtIndexPath, загрузите значение соответствующего ключа в словаре.

Было бы наиболее идеально назвать каждый ключ в вашем словаре в формате [indexPath section], [indexPath row], поскольку это поможет в настройке и получении значений.

Надеюсь, это поможет.

2 голосов
/ 08 января 2011

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

Следует избегать добавления подпредставлений в cellForRowAtIndexPath: метод.

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

Если вы не уверены, что на самом деле означает удаление ячеек, вам, вероятно, следует прочитать документацию Apple TableView. По сути, используйте подкласс UITableViewCell, и вы окажетесь в гораздо лучшем положении, чем пытаетесь добавить все свои представления в свой метод cellForRow.

2 голосов
/ 08 января 2011

Вам действительно нужно сохранить каждую ячейку и textField в viewController, а затем создать из нее ячейку, вставив части из другой ячейки?

возможно, вы можете сохранить всю ячейку в свойстве (например, self.authorCell), а затем просто отобразить эту ячейку:

if (indexPath.section == 0) {
    return self.authorCell; // or cell = self.authorCell
}

и вы все еще можете получить доступ к textField, обратившись к свойству ячейки:

self.authorCell.myTextField

// РЕДАКТИРОВАТЬ: см. Документацию Apple для "Техники для статического содержимого строки"

0 голосов
/ 08 января 2011

Попробуйте вставить это сразу после выделения ячейки и перед выполнением любого рисунка / маркировки / и т. Д.

cell.clearsContextBeforeDrawing = YES;

cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;

for (UIView *view in cell.contentView.subviews) {
    [view removeFromSuperview];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...