Если вы не знакомы со словом «рефакторинг», это означает (в данном случае) избегать повторения себя в коде.Есть несколько очень хороших учебных пособий о «СУХОМ программировании» онлайн.В качестве примера, не изменяя ничего в вашей программе, ниже ваш код в 30 строк против 500+ строк.Помимо того, что вы короче, это также означает, что если вы вносите изменение, вам нужно сделать его только один раз, а не 24 или 48 раз.В конце концов, вам будет намного легче увидеть, что вы делаете.
В частности, я согласен с trydis, что ваша проблема, конечно, не в этом коде, а в вашем cellForRowAtIndexPath.После того, как вы извлекаете ячейку из очереди или создаете ее, [cell setAccessoryType: UITableViewCellAccessoryNone] В противном случае у ячеек без очереди будет тот аксессуар, который был в этой ячейке, когда он исчез с экрана.Восемь, вероятно, происходит из-за наличия восьми ячеек на экране одновременно, поэтому проверенная ячейка исчезает сверху и «появляется» внизу.
В качестве последнего комментария построение строки кода страны в реальном временинемного некрасиво (отсюда и все о дефисах).Возможно, лучше сохранить список активных кодов в NSMutableSet, а затем добавить дефисы, когда вы собираетесь его отобразить.([[countrySelected allObjects] componentJoinedByString @ "-"]
NSArray * countryCodes =
[NSArray arrayWithObjects:@"AR",@"AU",@"BR",@"CA",@"CZ",@"FR",@"DE",@"GB",@"HK",@"IN",@"IE",@"IL",@"IT",
@"JP",@"MX",@"NL",@"NZ",@"PL",@"RU",@"ZA",:@"KR",@"ES",@"SE",@"TW",@"US",nil];
- (void)tableView:(UITableView *)tableView1 didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *selectedCell = [tableView1 cellForRowAtIndexPath:indexPath];
NSString *countryCode = [countryCodes objectAtIndex:indexPath.row];
if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {
[selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
if ([countriesselected length] == 0) {
countriesselected = countryCode;
} else {
countriesselected = [NSString stringWithFormat:@"%@-%@",countriesselected,countryCode]]; // note change to include hyphen
}
} else {
[selectedCell setAccessoryType:UITableViewCellAccessoryNone];
countriesselected = [countriesselected stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"-%@",countryCode]
withString:@""];
countriesselected = [countriesselected stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@-",countryCode]
withString:@""];
countriesselected = [countriesselected stringByReplacingOccurrencesOfString:countryCode"
withString:@""];
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
КОД ДЛЯ cellForRowAtIndePath:
NSString *countryCode = [countryCodes objectAtIndex:indexPath.row];
if ([countriesselected rangeOfString: countryCode].location != NSNotFound) {
[cell setAccessoryType:UITableViewCellAccessoryCheckmark];
} else {
[cell setAccessoryType:UITableViewCellAccessoryNone];
}