Я пытаюсь реализовать UITableViewController с 7 разделами.Каждый раздел имеет ряд строк, которые могут меняться в зависимости от пользовательских событий.Для примера, в первом разделе у меня есть одна строка с переключателем UIS: если пользователь активирует переключатель, в этом разделе появятся еще 2 строки.То же самое для раздела 2. Хорошо, пока ... В разделах 3, 4, 5 у меня также есть одна строка (например, ячейка Value1, общие настройки iPhone): при нажатии на эту ячейку разделы отображаются во втором ряду.UIS сегментированный контроль с 3 сегментами.При нажатии на один из этих сегментов пользователь делает свой выбор, и сегментированная строка управления исчезает, у секций снова появляется одна строка со значением, выбранным как detailTextLabel.
Что ж, все эти процедуры управляются методом reloadSectionsЭто перезагружает разделы, в которых пользователь взаимодействует.Мой код ниже:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier: CellIdentifier];
CellIdentifier = [ NSString stringWithFormat: @"%d:%d", [ indexPath indexAtPosition: 0 ], [ indexPath indexAtPosition:1 ]];
//cell = nil;
if(indexPath.section == 0 && [indexPath indexAtPosition: 1] == 0)
{
CellIdentifier = @"test";
}
if (cell == nil) {
cell = [ [ [ UITableViewCell alloc ] initWithFrame: CGRectZero reuseIdentifier: CellIdentifier] autorelease ];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
switch ([ indexPath indexAtPosition: 0]) {
case(0): {
switch([ indexPath indexAtPosition: 1]) {
case(0):
{
positionControl.tag = 0;
[positionControl addTarget:self action:@selector(toggleSwitch:) forControlEvents:UIControlEventValueChanged];
[ cell addSubview: positionControl ];
cell.textLabel.text = NSLocalizedString(@"Position",@"");
}
break;
case(1):
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.text = NSLocalizedString(@"Some Position",@"");
cell.detailTextLabel.text = NSLocalizedString(@"Last Known Position",@"");
}
break;
case(2):
{
cell.textLabel.text = NSLocalizedString(@"ReDo Position",@"");
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
break;
}
}
break;
case(1): {
switch ([ indexPath indexAtPosition: 1 ]) {
case(0):
{
photoControl.tag = 1;
[photoControl addTarget:self action:@selector(toggleSwitch:) forControlEvents:UIControlEventValueChanged];
[ cell addSubview: photoControl ];
cell.textLabel.text = NSLocalizedString(@"photos",@"");
}
break;
case(1):
{
cell.textLabel.text = NSLocalizedString(@"Take photo",@"");
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
break;
case(2):
{
cell.textLabel.text = NSLocalizedString(@"Select from Roll",@"");
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
break;
}
}
break;
case(2): {
switch ([ indexPath indexAtPosition: 1 ]) {
case(0):
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.text = NSLocalizedString(@"size",@"");
if (UISegmentedControlNoSegment != [dimensionSegmentedControl selectedSegmentIndex]) {
cell.detailTextLabel.text = [dimensionSegmentedControl titleForSegmentAtIndex:[dimensionSegmentedControl selectedSegmentIndex]];
}
else {
cell.detailTextLabel.text = NSLocalizedString(@"Select",@"");
}
}
break;
case(1):
{
[dimensionSegmentedControl addTarget:self action:@selector(onSegmentedControlChanged:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:dimensionSegmentedControl];
}
break;
}
}
break; ...
Тогда мое действие для переключателей:
- (IBAction) toggleSwitch: (id) sender {
UISwitch *switchControl = (UISwitch *) sender;
NSUInteger tag = switchControl.tag;
NSIndexSet *sectionsToReload = [[NSIndexSet alloc] initWithIndex:tag];
[self.tableView reloadSections:sectionsToReload withRowAnimation:NO];
[sectionsToReload release];}
Действие для сегментированного управления
- (IBAction) onSegmentedControlChanged: (id) sender {
UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
NSUInteger tag = segmentedControl.tag;
NSIndexSet *sectionsToReload = [[NSIndexSet alloc] initWithIndex:tag];
segmentedControl.momentary = YES;
[self.tableView reloadSections:sectionsToReload withRowAnimation:NO];
segmentedControl.momentary = NO;
[sectionsToReload release];}
Это didSelectRow
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch ([ indexPath indexAtPosition: 0]) {
case(2): {
switch([ indexPath indexAtPosition: 1]) {
case (0): {
if (UISegmentedControlNoSegment != [dimensionSegmentedControl selectedSegmentIndex]) {
dimensionSegmentedControl.selectedSegmentIndex = [dimensionSegmentedControl selectedSegmentIndex];
}
else {
dimensionSegmentedControl.selectedSegmentIndex = 0;
}
NSIndexSet *sectionsToReload = [[NSIndexSet alloc] initWithIndex:2];
//[self.tableView reloadData];
[self.tableView reloadSections:sectionsToReload withRowAnimation:NO];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[sectionsToReload release];
}
break;
}
}
break;
case(3): {
switch([ indexPath indexAtPosition: 1]) {
case (0): {
if (UISegmentedControlNoSegment != [patientsSegmentedControl selectedSegmentIndex]) {
patientsSegmentedControl.selectedSegmentIndex = [patientsSegmentedControl selectedSegmentIndex];
}
else {
patientsSegmentedControl.selectedSegmentIndex = 0;
}
NSIndexSet *sectionsToReload = [[NSIndexSet alloc] initWithIndex:3];
//[self.tableView reloadData];
[self.tableView reloadSections:sectionsToReload withRowAnimation:NO];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[sectionsToReload release];
}
break;
default:
break;
}
}
break;
case(4): {
switch([ indexPath indexAtPosition: 1]) {
case (0): {
if (UISegmentedControlNoSegment != [patientsStateSegmentedControl selectedSegmentIndex]) {
patientsStateSegmentedControl.selectedSegmentIndex = [patientsStateSegmentedControl selectedSegmentIndex];
}
else {
patientsStateSegmentedControl.selectedSegmentIndex = 0;
}
NSIndexSet *sectionsToReload = [[NSIndexSet alloc] initWithIndex:4];
//[self.tableView reloadData];
[self.tableView reloadSections:sectionsToReload withRowAnimation:NO];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[sectionsToReload release];
}
break;
}
}
break;
case(5): {
switch([ indexPath indexAtPosition: 1]) {
case (0):
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4030"]];
break;
case (1):
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://4030"]];
break;
}
}
break;
default: break;
}}
И, наконец, мой numbersOfRowsInSections, вероятно, источник проблем:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
switch (section) {
case (0):
{
if (!positionControl.on) {
return 1;
break;
}
return 3;
}
break;
case (1):
{
if (!photoControl.on) {
return 1;
break;
}
return 3;
}
break;
case (2):
{
if (UISegmentedControlNoSegment == [dimensionSegmentedControl selectedSegmentIndex] || [dimensionSegmentedControl isMomentary]) {
return 1;
break;
}
return 2;
}
break;
case (3):
{
if (UISegmentedControlNoSegment == [patientsSegmentedControl selectedSegmentIndex] || [patientsSegmentedControl isMomentary]) {
return 1;
break;
}
return 2;
}
break;
case (4):
{
if (UISegmentedControlNoSegment == [patientsStateSegmentedControl selectedSegmentIndex] || [patientsStateSegmentedControl isMomentary]) {
return 1;
break;
}
return 2;
}
break;
case (5): {
return 2;
}
break;
case (6): {
return 1;
}
break;
}
return 0;}
Ну, теперь вы можете увидеть мой код, я объясню свою проблему.Когда я имею дело с UISwitches, разделы перезагружаются должным образом .... строки появляются и исчезают в первых двух разделах как очарование.Но когда я щелкаю по ячейкам в разделах с сегментированными элементами управления, в первый раз все в порядке, в ячейке отображается сегментированный элемент управления, пользователь делает свой выбор, сегментированный элемент управления исчезает, а в одной строке отображается выбор пользователя в detailTextLabel.Но когда я пытаюсь щелкнуть по другой строке, приложение вылетает со следующим исключением:
*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк враздел 3. Количество строк, содержащихся в существующем разделе после обновления (2), должно быть равно количеству строк, содержащихся в этом разделе до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела.(0 вставлено, 0 удалено). '2010-07-16 13: 09: 04.595 Штрих-коды [40421: 207] Стек: (35943515, 2535093513, 36027451, 1928964, 4228395, 4172781, 278302, 4188742, 4171908, 1425834, 35728064, 35724360, 43226645, 43229568, 83269595, 832, 86454)
Разница между двумя разделами заключается в том, что те, в которых переключатели UIS показывают и скрывают строки, активируя / деактивируя переключатель, другие выбирают строки (didSelectRow ....).
ЛЮБАЯ ПОМОЩЬ ??
Заранее спасибо.