Search code examples
objective-ciosuitableviewuiswitchdidselectrowatindexpath

Activate cell's accessory view (UISwitch) when didSelectRowAtIndexPath is called


Every cell of my tableView has a UISwitch as an accessoryView:

UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = mySwitch;
[mySwitch addTarget:self action:@selector(SwitchToggle:) forControlEvents:UIControlEventValueChanged];

Switch is toggled when the user taps it, but I also want it toggled when the didSelectRowAtIndexPath is called (when the user taps on that cell).

I tried this (but it doesn't work):

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{  
    UISwitch *tempSwitch = (UISwitch *)[tableView cellForRowAtIndexPath:indexPath].accessoryView;
    [tempSwitch addTarget:self action:@selector(SwitchToggle:) forControlEvents:UIControlEventValueChanged];

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; // cell selection fadeout animation
}

Thanks.


Solution

  • The code must look like this:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {  
        UISwitch *tempSwitch = (UISwitch *)[tableView cellForRowAtIndexPath:indexPath].accessoryView;
        [tempSwitch setOn:!tempSwitch.on animated:YES];
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    

    Remember that you also have to update your model.