2010-11-19 25 views
0

Je veux un UISwitch dans TableViewCell pour changer le texte de 'Actif' à 'Désactivé' et vice versa quand il est commuté mais quand le commutateur change, toutes les données dans ma vue de table disparaissent . J'utilise 'recharger les données' car je ne sais pas comment changer le texte d'une cellule spécifique. FYI, 'article actuel' est une entité de données de base avec une propriété BOOL 'itemEnabled'.UISwitch dans TableViewCell - Changer le texte de la cellule lors du changement

Le commutateur n'est visible que pendant le 'mode d'édition'.

J'ai un UISwitch dans une vue cellule de tableau dans mon 'contrôleur vue détaillée':

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

UITableViewCell *cell = nil; 
NSString *cellDetail = nil; 

     static NSString *EnabledCellIdentifier = @"Enabled"; 
     cell = [tableView dequeueReusableCellWithIdentifier:EnabledCellIdentifier]; 
     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EnabledCellIdentifier] autorelease]; 
      UISwitch* actSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; 
      [cell setEditingAccessoryView:actSwitch]; 
      [actSwitch addTarget:self action:@selector(actSwitchChanged:) forControlEvents:UIControlEventValueChanged]; 
      if ([[currentItem valueForKey:@"itemEnabled"] boolValue]) { 
       cellDetail = @"Active"; 
       actSwitch.on = YES; 
      } else { 
       cellDetail = @"Disabled"; 
       actSwitch.on = NO; 
      } 
      [actSwitch release]; 

    cell.textLabel.text = cellDetail; 

return cell; 

}

J'ai une méthode pour recevoir l'action:

- (void)actSwitchChanged:(id)sender { 

UISwitch* swEnabled = (UISwitch*)sender; 

NSManagedObjectContext* itemContext = [currentItem managedObjectContext]; 

currentItem.itemEnabled = [NSNumber numberWithBool:swEnabled.on]; 

NSError *error = nil; 
if (![itemContext save:&error]) { 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

}

+0

Je ne vois pas où vous utilisez reloadData – Brian

Répondre

0

Je subclassed UISwtich et inclus la propriété pour stocker le chemin d'index de la cellule, qui peut ensuite être utilisé dans la méthode d'action:

- (void)actSwitchChanged:(id)sender { 

TLSwitchInCell* swEnabled = (TLSwitchInCell*)sender; 

currentItem.itemEnabled = [NSNumber numberWithBool:swEnabled.on]; 

UITableViewCell* theCell = [self.tableView cellForRowAtIndexPath:swEnabled.cellIndexPath]; 

theCell.textLabel.text = swEnabled.on ? @"Active" : @"Disabled"; 

}

1

Vous pouvez obtenir une cellule spécifique avec -[UITableView cellForRowAtIndexPath:]. Vous avez juste besoin de connaître le chemin de l'index de la cellule (notez également que vous demandez à la tableview pour la cellule, n'appelant pas la méthode de délégué).

+0

Comment pourrais-je connaître le chemin d'index? Le commutateur peut-il l'envoyer dans le cadre du message d'action? – Glynton

+0

Est-il possible de définir un identifiant de l'objet commutateur qui est fondamentalement le chemin d'index de la cellule? – Glynton

2

Voici une approche pour obtenir la cellule de l'intérieur la méthode d'action qui ne nécessite pas subclassing UISwitch:

- (void)switchAction:(id)sender { 

    // Cast the sender as a UISwitch 
    UISwitch *aSwitch = (UISwitch *)sender; 

    // Cast the superview of aSwitch to a UITableViewCell 
    UITableViewCell *cell = (UITableViewCell *)aSwitch.superview; 

    // You could get an indexPath as follows (though you don't need it in this case) 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];  

    // Set the text of the label in your cell 
    cell.textLabel.text = aSwitch.on ? @"Active"; : @"Disabled"; 
} 
0

une autre variation sur un thème! Si vous avez beaucoup de champs de paramètres avec des boutons de commutation, vous pouvez utiliser quelque chose comme ça pour récupérer le texte d'étiquette associé au bouton de commutation qui a été déclenché! Vous pouvez définir le texte en utilisant les méthodes habituelles!

@IBAction func switch(sender: UISwitch) { 
    let labelIndex = sender.superview!.subviews.indexOf({$0 is UILabel}) 
    NSLog("The text from the label associated with this switch is %@", 
    (sender.superview!.subviews[labelIndex!] as! UILabel).text!) 
}