Представление таблицы с пользовательскими ячейками - PullRequest
1 голос
/ 01 сентября 2011

В моем приложении есть таблица с пользовательскими ячейками, и каждая ячейка содержит две кнопки-флажки.

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

Пожалуйста, дайте мне решение.

Спасибо тебе

Ответы [ 5 ]

1 голос
/ 01 сентября 2011

Вам нужно будет самостоятельно составить список, чтобы определить, какие ячейки следует проверять или нет. Помните, что в tableView:cellForRowAtIndexPath: правильная реализация будет перезапускать ячейки, так что вам никогда не придется создавать более 10-15 ячеек. Это может привести к некоторым интересным результатам, если вы не справитесь с этим должным образом. Когда я сделал плохую реализацию, я увидел, что некоторые свойства ячеек «переносятся» из одной ячейки в другую.

В любом случае, вот что я бы порекомендовал (основываясь на том, что, по-моему, вы спрашиваете):
1. Создайте класс для поддержки каждого UITableViewCell
2. Создайте свойство в этом классе, чтобы определить, какие из двух флажков (или ни один, ни оба) должны быть отмечены.
3. В вашем ViewController / TableViewController сохраните NSMutableArray / NSArray, где 1 элемент в массиве = 1 ячейка в UITableView.
4. В вашем методе tableView:cellForRowAtIndexPath: получите ссылку на соответствующий элемент в вашем массиве.
5. Затем проверьте свойства этого экземпляра и установите соответствующие значения флажков.


Пример кода:

TableView.h

@interface TableView : UITableViewController 

@property (strong, nonatomic) NSMutableArray *itemArray;

@end

TableView.m

@implementation TableView

@synthesize itemArray;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Assume you get a valid, custom UITableViewCell at this point (named "cell")

    // Configure the cell...
    NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]];
    [[cell checkBox1] setChecked:[classItem checkbox1Checked]];
    [[cell checkBox2] setChecked:[classItem checkbox2Checked]];

    return cell;
}

@end
0 голосов
/ 07 сентября 2011

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

0 голосов
/ 01 сентября 2011

Используете ли вы cellForRowAtIndexPath. Если да, то вместо

 static NSString CellIdentifier=@"CellIdentifier"

использование

 NSString *CellIdentifier=[NSString stringWithFormat=@"CellIdentifier%d",indexPath.row];

Другой подход, который вы можете использовать, - это назначить теги кнопкам checkbox и взять один словарь в файле appDelegate и установить значение для флажка tag. Первоначально вы можете установить флажок или не отмечен. И установить значения в методе cellforrowatindexpath. установите значения флажков согласно словарю appdelegate. и обновите состояние в словаре appdelegate, когда пользователь выбирает или отменяет выбор кнопки.

0 голосов
/ 01 сентября 2011

Вы можете сохранить состояние в NSUserDefaults прямо при нажатии на него.Просто добавьте цель с помощью @selector(changedOne: ) и добавьте оператор void:

- (void)changedOne: (id)sender  {
    NSUserDefaults *df = [NSUserDefaults standardUserDefaults];
    NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row];
    if (sender.on) {
        [df setBool:YES forKey:row];
    }
    else {
        [df setBool:NO forKey:row];
    }
}
0 голосов
/ 01 сентября 2011

Ну, вы не должны использовать TableView в качестве источника данных.

Каждый раз, когда ячейка открывается, UITableViewDataSource запрашивается для UITableViewCell в качестве indexpath.

- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath 

В методе is вы должны установить состояние флажка, как это отражается в вашем dataSource,Когда флажок изменен, сохраните его в источнике данных с выбранным состоянием.

Пример:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"CheckedTableViewCell";

    CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell) {
        [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil];
        cell = (CheckedTableViewCell *)self.nibCell;
        self.nibCell = nil;
    }

    item *item = [self objectAtIndexPath:indexPath];

    cell.titleLabel.text = item.title;
    cell.switch.on = item.selected;

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