Как программно переключить кнопку uiswitch

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Я добавил пользовательский интерфейс в строку 3 моего TableViewController программно. Она отображается правильно, и я сохраняю состояние переключателя в NSUserDefaults. Я также сравниваю, в зависимости от значения NSUserDefaults и строкового значения, на которое я пытаюсь изменить состояние моего коммутатора (включено или ВЫКЛЮЧЕНО), но проблема в том, что состояние коммутатора не меняется.

Это мой код:

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    switch (indexPath.row) {

        case 2:
            cell.textLabel.text = @"Weather";   
            switchControl = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = switchControl;

            [self.switchControl setOn:YES animated:NO];
            [self.switchControl addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
            [switchControl release];
            break;


        default:
            break;
    }
    cell.textLabel.text = [settings objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



    return cell;
}



-(void)switchChanged:(id)sender
{

    app= (StopSnoozeAppDelegate*)[[UIApplication sharedApplication]delegate];

        NSString *value;
    userdefaults = [NSUserDefaults standardUserDefaults];
        if(!switchControl.on){
            value = @"OFF";
            [userdefaults setObject:value forKey:@"stateOfSwitch"];
        }
        [userdefaults setObject:value forKey:@"stateOfSwitch"];
    [userdefaults synchronize];

}


- (void)viewWillAppear:(BOOL)animated {
    NSString *_value= [[NSUserDefaults standardUserDefaults] stringForKey:@"stateOfSwitch"];

    if([_value compare:@"ON"] == NSOrderedSame){
        [self.switchControl setEnabled:YES];
    }
    else {
        [self.switchControl setEnabled:NO];
    }
    [super viewWillAppear:animated];
}
  

В появившемся представлении я сравниваю строку с моим значением NSUserDefaults и пытаюсь изменить состояние переключателя. Он правильно вводит точку останова, но не меняет состояние переключателя с ON на OFF.

Ответ №1:

Вы можете отключить настройку UISwitch

 [yourSwitch setOn:NO animated:YES]; 
  

и включите настройку

 [yourSwitch setOn:YES animated:YES];
  

Ответ №2:

Это не имеет никакого смысла:

 switchControl = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchControl;

[self.switchControl setOn:YES animated:NO];
[self.switchControl addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
[switchControl release];
  

Вы создаете переключатель, выполняете некоторые действия, предположительно, с другим переключателем, а затем отпускаете первый. Попробуйте это:

 self.switchControl = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchControl;

[self.switchControl setOn:YES animated:NO];
[self.switchControl addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
  

Ответ №3:

Попробуйте написать следующий код cellForRowAtIndexPath вместо viewWillAppear :

 NSString *_value= [[NSUserDefaults standardUserDefaults] stringForKey:@"stateOfSwitch"];

if([_value compare:@"ON"] == NSOrderedSame) {
    [self.switchControl setEnabled:YES];
} else {
    [self.switchControl setEnabled:NO];
}
  

Ответ №4:

Вы можете просто переключиться ON , установив:

 switchOutlet.on = YES;
  

и сделайте это OFF с помощью:

 switchOutlet.on = NO;