Установите переключатель в положение On, перезагрузите таблицу и вставьте новую строку - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть UITableViewController, который я использую для создания настроек моего приложения.

В секции, содержащей только одну строку, я помещаю переключатель UIS.
Как вставить новую строку в ту же секцию строки с помощью переключателя, только если переключатель установлен в положение YES?И как я могу удалить эту строку, если переключатель установлен в положение NO?

Кто-нибудь может мне помочь?Спасибо!

Я пытался использовать insertRowsAtIndexPaths: withRowAnimation: метод, но не работает ...
Это мой код таблицы настроек:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = NSLocalizedString(@"Impostazioni", @"");
}


- (void)viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}

-(void)addCellToSetCode:(id)sender {

    if ([codeSwitch isOn]) {

        NSIndexPath *updatedIndexPath = [NSIndexPath indexPathForRow:1 inSection:2];
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:updatedIndexPath] withRowAnimation:UITableViewRowAnimationTop];
        [self.tableView endUpdates];

        [[NSUserDefaults standardUserDefaults] setBool:codeSwitch.on forKey:@"stateOfSwitch"];
    }
    else {

        NSIndexPath *updatedIndexPath = [NSIndexPath indexPathForRow:1 inSection:2];
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:updatedIndexPath] withRowAnimation:UITableViewRowAnimationTop];
        [self.tableView endUpdates];

        [[NSUserDefaults standardUserDefaults] setBool:codeSwitch.on forKey:@"stateOfSwitch"];
    }
}


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 4;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if (section == 0) {
        return NSLocalizedString(@"ListaDesideri", @"");
    }
    if (section == 1) {
        return NSLocalizedString(@"CondivisioneMail", @"");
    }
    if (section == 2) {
        return @"Sicurezza";
    }
    else {
        return nil;
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 0) || (section == 2) || (section == 3) {
        return 2;
    }
    else if (section == 1) {
        return 1;
    }
    else {
        return 1;
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }
    if (indexPath.section == 0 && indexPath.row == 0) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        cell.textLabel.text = NSLocalizedString(@"Ordine", @"");

        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Nome"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Nome", @"");
        }
        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Costo"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Costo", @"");
        }
        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Categoria"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Categoria", @"");
        }
        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Nome Discendente"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"NomeDiscendente", @"");
        }
        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Costo Discendente"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"CostoDiscendente", @"");
        }
        if ([[defaults objectForKey:@"ordinaPer"] isEqualToString:@"Categoria Discndente"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"CategoriaDiscendente", @"");
        }

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    if (indexPath.section == 0 && indexPath.row == 1) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        cell.textLabel.text = NSLocalizedString(@"DettagliDesiderio", @"");

        if ([[defaults objectForKey:@"dettagliView"] isEqualToString:@"costoView"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Costo", @"");
        }
        if ([[defaults objectForKey:@"dettagliView"] isEqualToString:@"descrizioneView"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Descrizione", @"");
        }
        if ([[defaults objectForKey:@"dettagliView"] isEqualToString:@"urlView"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"URL", @"");
        }

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    if (indexPath.section == 1 && indexPath.row == 0) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        cell.textLabel.text = NSLocalizedString(@"Shortener", @"");

        if ([[defaults objectForKey:@"linkShortener"] isEqualToString:@"Nessuno"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Nessuno", @"");
        }
        if ([[defaults objectForKey:@"linkShortener"] isEqualToString:@"is.gd"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"is.gd", @"");
        }
        if ([[defaults objectForKey:@"linkShortener"] isEqualToString:@"bit.ly"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"bit.ly", @"");
        }
        if ([[defaults objectForKey:@"linkShortener"] isEqualToString:@"TinyURL"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"TinyURL", @"");
        }
        if ([[defaults objectForKey:@"linkShortener"] isEqualToString:@"Linkyy"]) {
            cell.detailTextLabel.text = NSLocalizedString(@"Linkyy", @"");
        }

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    if (indexPath.section == 2 && indexPath.row == 0) {
        cell.textLabel.text = @"Access Code";

        codeSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 84, 27)];
        cell.accessoryView = codeSwitch;
        [codeSwitch addTarget:self action:@selector(addCellToSetCode:) forControlEvents:UIControlEventValueChanged];
        codeSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"codeSwitchState"];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    if (indexPath.section == 3 && indexPath.row == 0) {
        cell.textLabel.text = NSLocalizedString(@"Supporto", @"");
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    if (indexPath.section == 3 && indexPath.row == 1) {
        cell.textLabel.text = NSLocalizedString(@"Informazioni", @"");
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}

РЕДАКТИРОВАТЬ: Обновления ниже ...

Я решил часть этой проблемы!
Я пытался использовать [self.tableView reloadData], но не работает, и случайно решил, используя [self.tableView setNeedsDisplay] ...

Теперь коммутатор работает, но если я установил на него, а затем выхожу из приложения, полностью закрывая его, коммутатор не работает ... Как я могу решить эту проблему?

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

-(void)addCellToSetCode:(id)sender {

    if ([codeSwitch isOn]) {

        NSIndexPath *updatedIndexPath = [NSIndexPath indexPathForRow:1 inSection:2];
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:updatedIndexPath] withRowAnimation:UITableViewRowAnimationTop];
        [self.tableView endUpdates];

        [self.tableView setNeedsDisplay];

        [[NSUserDefaults standardUserDefaults] setBool:codeSwitch.on forKey:@"codeSwitchState"];
    }
    else {

        NSIndexPath *updatedIndexPath = [NSIndexPath indexPathForRow:1 inSection:2];
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:updatedIndexPath] withRowAnimation:UITableViewRowAnimationTop];
        [self.tableView endUpdates];

        [self.tableView setNeedsDisplay];

        [[NSUserDefaults standardUserDefaults] setBool:codeSwitch.on forKey:@"codeSwitchState"];
    }
}

// tableView:numberOfRowsInSection:
else if (section == 2) {
    return codeSwitch.on ? 2 : 1;
}

// tableView:cellForRowAtIndexPath:
if (indexPath.section == 2 && indexPath.row == 0) {
    cell.textLabel.text = @"Access Code";

    codeSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 84, 27)];
    cell.accessoryView = codeSwitch;
    [codeSwitch addTarget:self action:@selector(addCellToSetCode:) forControlEvents:UIControlEventValueChanged];
    codeSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"codeSwitchState"];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
if (indexPath.section == 2 && indexPath.row == 1) {
    if ([codeSwitch isOn]) {
        cell.textLabel.text = @"Set Access Code";
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}

1 Ответ

1 голос
/ 21 декабря 2010

По крайней мере, частью вашей проблемы (в обновленном коде) является то, что вы не создаете переключатель UIS, пока не создадите ячейку.Ваш codeSwitch ivar может в конечном итоге указывать на другой переключатель, когда строка таблицы входит и выходит из поля зрения.

Вот как я бы это сделал: в tableView:numberOfRowsInSection: используйте NSUserDefaults, чтобы увидеть, в каком состояниитаблица должна быть в состоянии, а не использовать состояние коммутатора (который может еще не существовать).Затем в методе действия коммутатора вызовите setBool:forKey: для пользовательских значений по умолчанию перед тем, как вставить или удалить строку таблицы.

По сути, это заставляет код лучше следовать модели MVC,потому что он отделяет ваше представление (UISwitch) от модели (BOOL в пользовательских значениях по умолчанию), с контроллером (контроллер представления) в середине.Смешивая представление и модель (переключатель и логическое состояние), вы сталкиваетесь с проблемами при попытке справиться с состоянием, когда представление еще не доступно.

Кстати, вам не нужновообще вызвать setNeedsDisplay в табличном представлении.

...