iPhone UITableViewController показывает / скрывает строки во время выполнения - PullRequest
0 голосов
/ 16 июля 2010

Я пытаюсь реализовать 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 ....).

ЛЮБАЯ ПОМОЩЬ ??

Заранее спасибо.

1 Ответ

0 голосов
/ 16 июля 2010

мой код хорош, если я просто добавляю флаг (BOOL), говорящий, должен ли каждый сегментированный элемент управления быть видимым или нет.При установке этих флагов «ДА» и «НЕТ» и проверке их значения все работает правильно.

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