web-dev-qa-db-fra.com

Comment créer un UITableViewCell avec un UISwitch et obtenir les données?

J'ai un problème simple. J'ai créé un UITableViewCell personnalisé qui inclut un UISwitch dans Interface Builder.

Question 1: Une manière plus simple et meilleure de le faire? Question 2: Lorsqu'il est utilisé dans un UITableViewController, quelle serait la meilleure façon d'obtenir les données? À un moment donné, je dois soit parcourir le tableau et vérifier chaque cellule à propos de l'état OR envoyer des commentaires lorsque l'état des commutateurs change directement?

Merci pour l'aide.

32
eemceebee

Vous pouvez simplement ajouter le UISwitch dans votre vue d'accessoire. C'est la façon la plus simple de le faire, sans oublier qu'il a l'air "élégant".

Ensuite, dans votre code de contrôleur de table, vous pouvez simplement appeler un sélecteur chaque fois que le commutateur est basculé, ou même basculer le commutateur lui-même en obtenant l'état actuel du commutateur dans votre contrôleur.

Faites-nous savoir si vous souhaitez un exemple de code.

--- exemple de code ---

- (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];
    //add a switch
    UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
    cell.accessoryView = switchview;
    [switchview release];
}

cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

return cell;
}

Ensuite, vous pourriez avoir une méthode qui met à jour un commutateur en fonction des modifications de votre modèle. Vous pouvez utiliser tout ce que vous voulez - délégués, notifications, KVO, etc.

Exemple:

- (void)updateSwitchAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
UISwitch *switchView = (UISwitch *)cell.accessoryView;

if ([switchView isOn]) {
    [switchView setOn:NO animated:YES];
} else {
    [switchView setOn:YES animated:YES];
}

 }
85
Saurabh G
Switch.tag = indexPath.row;
[Switch addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventTouchUpInside];



- (void)updateSwitchAtIndexPath:(UISwitch *)aswitch{
    FFLog(@"%i",aswitch.tag);
}
8
wang.qingyi

Merci. Je n'ai pas votre indexPath, mais vous pouvez identifier une cellule ou un objet avec une balise comme celle-ci:

if (indexPath.row == 0) {
        cell.textLabel.text = @"Twitter";


        UISwitch *switchview = [[UISwitch alloc] initWithFrame:CGRectZero];
        switchview.tag = 111;
        //switchview.selected = 0;
        cell.accessoryView = switchview;

        [switchview addTarget:self action:@selector(updateSwitchAtIndexPath) forControlEvents:UIControlEventTouchUpInside];

        //cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;
        //[switchview release];

    }


- (void)updateSwitchAtIndexPath {

for (UITableViewCell * cell in tblView.subviews) {

   for (UISwitch *swch in cell.subviews) {


         UISwitch *switchView = (UISwitch *)cell.accessoryView;

        if (switchView.tag == 111) {

            if ([switchView isOn]) {
                 NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        } 

          if (switchView.tag == 222) {
            if ([switchView isOn]) {
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ON");
            }else{
                NSLog(@")>>>>>>>>>>>>>>>>>>>>>>>>>>>>> OFF");
            }

        }
    }
}

}

4
kalpesh jetani

Deux options:

1) initialisez votre cellule avec un pointeur sur votre modèle de données. Demandez à la cellule d'implémenter le rappel délégué pour le commutateur. Lorsque le commutateur change, utilisez le pointeur sur votre modèle de données pour refléter le nouveau paramètre. Vous pouvez également initialiser la cellule avec un pointeur sur votre contrôleur de vue. Demandez à la cellule d'implémenter la méthode de délégué délégué, puis rappelez-la dans votre contrôleur de vue avec les informations de contexte de cellule appropriées.

2) demandez à votre contrôleur de vue de mettre en œuvre le rappel de délégué de commutateur. Lorsque le commutateur change, déterminez de quel commutateur/cellule il s'agissait (il se peut que vous deviez définir la propriété "tag" du commutateur comme un numéro de ligne ou quelque chose) et gérer la mise à jour dans le contexte de votre contrôleur de vue.

3
TomSwift

Pour obtenir la valeur de UISwitch dans Swift 3 et Swift 4, vous pouvez lui ajouter une cible:

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {

    ...

    cell.uiSwitch.tag = 100
    cell.uiSwitch.addTarget(self, action: #selector(ViewController.switchAtValueChanged(switchFromTableViewCell:)), for: UIControlEvents.valueChanged)

    ...
}

Et vous pouvez obtenir la valeur comme ceci:

@objc func switchAtValueChanged(uiSwitch: UISwitch) {

    if uiSwitch.tag == 100 {
        let value = uiSwitch.isOn
    }
} 
1
pableiros