UISwitch не включается при изменении состояния данных ядра - PullRequest
0 голосов
/ 14 августа 2011

У меня есть таблица, где каждая строка представляет объект в основных данных. Каждая строка содержит UISwitch (измененный, чтобы содержать indexPath строки, в которой он содержится), который при переключении должен переключать свойство состояния объекта в основных данных.

В настоящее время происходит переключение во включенное состояние при касании, а затем снова в выключенное состояние!?

Единственная подсказка, которую я имею, это то, что, когда я комментирую

// Establish what position the switch should be in
    if([info.state isEqualToString:@"on"]){
        mySwitch.selected = TRUE;
    } else {
        mySwitch.selected = FALSE;
    }

и две строки info.state в методе changeState, переключатель работает нормально. Похоже, что установщик info.state, независимо от их влияния на состояние переключателя, предотвращает переключение переключателя.

Я просто веду себя небрежно и неправильно управляю памятью?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    InfoObject *info = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = info.name;

    // Use a custom UISwitch that holds a pointer to the row it is associated with
    NamedUISwitch *mySwitch = [[[NamedUISwitch alloc] initWithFrame:CGRectZero] autorelease];
    mySwitch.indexPath = indexPath;
    [mySwitch addTarget:self action:@selector(changeState:) forControlEvents:UIControlEventValueChanged];
    // And of course we need to know what the state is
    NSLog(@"switchState:%@",info.state);

    // Establish what position the switch should be in
    if([info.state isEqualToString:@"on"]){
        mySwitch.selected = TRUE;
    } else {
        mySwitch.selected = FALSE;
    }

    cell.accessoryView = mySwitch;
}

- (void) changeState:(id)sender {
    InfoObject *info = [self.fetchedResultsController objectAtIndexPath:((NamedUISwitch*)sender).indexPath];

    if(((NamedUISwitch*)sender).on){
        info.state = @"on";
    } else {
        info.state = @"off";
    }

    NSError *error;
    if (![self.context save:&error]) {
        NSLog(@"Whoops, couldn't save state: %@", [error localizedDescription]);
        //TODO: alertview
    }
}

1 Ответ

4 голосов
/ 14 августа 2011

Я думаю, что код должен быть:

// Establish what position the switch should be in
    if([info.state isEqualToString:@"on"]){
        mySwitch.on = YES;
    } else {
        mySwitch.on = NO;
    }
...