Множественный выбор UITableView. автоматически выбирает случайную строку с выбранной строкой

У меня есть 30 строк в удобном представлении, и я пытаюсь выбрать несколько строк и установить для них флажок.

Всякий раз, когда я выбираю одну строку, автоматически выбирается другая строка и сверяется с нужной строкой.

Также, когда я прокручиваю таблицу, она автоматически меняет выбор.

Я использовал этот код с меньшим количеством строк (8), и он работал отлично. Для более чем 12 строк это дает проблему, которую я описал.

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

Я новичок в xcode, любая помощь очень ценится. Спасибо.

Вот мой код:

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [listOfItems count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
cell.text = cellValue;

return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

    if(count < 3)
    {

        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]];
        count++;
    }

    NSLog(@"Count: %d", count);
    NSLog(@"Items I selected @ %d:", indexPath.row);
    NSLog(@"Items I selected: %@", selectedIndexes);
} 

else {

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]];
    count --;
    NSLog(@"Items I de-selected @ %d:", indexPath.row);

}

[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSMutableString *resultlearning = [[NSMutableString alloc]init];
for (int i = 0; i < [listOfItems count]; i++) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
    //[tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        [resultlearning appendFormat:@"%@, ",cell.textLabel.text];
    }
}
if (resultlearning.length > 2) {
    [resultlearning replaceCharactersInRange:NSMakeRange(resultlearning.length-1, 1) withString:@""];
}
NSLog(@"Result: %@",resultlearning);
}

person Sanjyot Shah    schedule 25.07.2012    source источник


Ответы (4)


Добавьте один изменяемый массив в файл .h. Здесь добавьте столько объектов в массив, сколько есть в вашем массиве tableDataSourc. Теперь мое намерение состоит в том, что если он содержит 0, то эта ячейка не выбрана или содержит 1, тогда эта ячейка выбрана

Теперь сделайте это, поскольку у вас есть массив selectedIndexes, поэтому вам нужен другой изменяемый массив:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
for(int i = 0;i<[listOfItems count];i++)
{
[selectedIndexes addObject:@"0"];
}
   return [listOfItems count]
 }


 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

 if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

     [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
     [selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"1"];
}
else
{          
selectedCell.accessoryType = UITableViewCellAccessoryNone;
[selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"0"];
}

Теперь у selectedIndexes есть объект с 1 значением, что означает, что значение выбрано в listOfItems

person Paresh Navadiya    schedule 25.07.2012
comment
привет, значит, selectedIndexes — это другой изменяемый массив, который вы хотите, чтобы я объявил, или мне нужно добавить еще один, кроме selectedIndexes? - person Sanjyot Shah; 25.07.2012
comment
вам не нужно добавлять какой-либо другой изменяемый массив, так как я предполагаю, что у вас есть массив selectedIndexes, а если нет, то добавьте изменяемый массив и alloc в методе viewDidLoad - person Paresh Navadiya; 26.07.2012

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

Лучше отслеживать только те ячейки, которые выбраны в качестве данных в методе didSelectRowAtIndexPath:, а затем включать или выключать аксессуар для всех ячеек в методе cellForRowAtIndexPath:.

person Phillip Mills    schedule 25.07.2012
comment
Хорошо, вы имеете в виду, что я должен хранить индексы в массиве, а затем использовать массив для включения или выключения аксессуара? Не могли бы вы продемонстрировать это, используя блок кода, пожалуйста? - person Sanjyot Shah; 25.07.2012
comment
или если бы вы могли отредактировать это в моем посте, это было бы здорово. Спасибо и извините за беспокойство, я новичок в xcode. - person Sanjyot Shah; 25.07.2012

Логика проверки/снятия отметки с вспомогательного типа ячейки должна идти в cellForRowAtindexPath. В didSelectRowAtIndexPath вы должны заботиться только о выбранной строке.

person Apurv    schedule 25.07.2012

Хм... Я все еще пью свою первую чашку кофе этим утром, но что-то подсказывает мне, что у вас уже есть "выбранная" строка, когда вызывается didSelectRowAtIndexPath. Тогда кажется, что оператор if может делать что-то странное и выбирать следующую строку или что-то в этом роде. Вы пробовали комментировать оператор if? Я знаю, что, вероятно, за раз будет выбран только один, но просто посмотреть, не в этом ли причина. Кроме того, выбрана ли следующая строка, предыдущая?

person Indy-Jones    schedule 25.07.2012
comment
Я пробовал комментировать. Предварительно выбранной строки нет. И нет, это не ранее выбранная строка. Также выбор меняется автоматически, когда я прокручиваю вниз или вверх и возвращаюсь, чтобы увидеть выбор. Я думаю, что в моей логике есть серьезный недостаток. Если вы можете предложить другую логику или код, это тоже будет хорошо. Что я хочу сделать, так это иметь 30 строк в моей таблице и иметь возможность выбирать максимум 3 из 30 и применять проверки к выбранным строкам и сохранять контрольные строки в одной строковой переменной. - person Sanjyot Shah; 25.07.2012