2017-10-12 17 views
-1

J'ai besoin d'une cellule qui a un titre, une description et un commutateur sur la droite. Je suis capable de programmer ceci par moi-même, mais je voudrais profiter des cellules subtitle qui ont déjà une description (detailTextLabel). Cependant, lorsque j'essaie d'ajouter un UISwitch dans Interface Builder, cela ne fonctionne tout simplement pas. Premièrement, il ne me laisse pas glisser l'interrupteur dans la cellule. Quand je fais glisser à l'extérieur, puis l'insérer dans le Content View du Document Outline (barre latérale de gauche), il semble être à l'intérieur, mais je ne peux pas ajouter des contraintes: Cell with switch insideAjouter UISwitch à TableViewCell de style sous-titre

J'ai un SwitchCell.swift qui ressemble à ceci:

public class SwitchCell: UITableViewCell { 

    @IBOutlet var title: UILabel! 
    @IBOutlet var switch: UISwitch! 
... 
} 

Je peux créer un lien vers le storyboard pour l'étiquette de titre, pas pour le commutateur.

Est-ce que quelqu'un sait ce que je dois modifier pour ajouter une étiquette d'accessoire à la cellule de sous-titre? Il fonctionne avec le code du contrôleur avec cell.accessoryView.= UISwitch(), mais j'aimerais savoir pourquoi cela n'est pas possible dans l'Interface Builder

Répondre

-1

Dans Interface Builder, vous ne pouvez pas modifier les types de cellule intégrés tels que "subtitle". cellules qui ont déjà une description (detailTextLabel). " Si vous souhaitez ajouter un commutateur ou effectuer d'autres modifications de contenu dans Interface Builder, vous devez utiliser une cellule personnalisée.

Vous pouvez toutefois continuer à utiliser une cellule subtitle dans Interface Builder, mais ajouter et configurer votre commutateur dans le code (en cellForRowAt:, par exemple).

+0

c'est ce que j'ai déjà fait (comme expliqué dans ma question). Savez-vous pourquoi c'est comme ça? Ce n'est pas que la cellule est créée comme non modifiable (peut être modifiée à partir du programme). –

+1

C'est exactement la manière dont Interface Builder implémente les types de cellules intégrés. Le mien ne pas raisonner pourquoi; Je ne travaille pas pour Apple. Je pourrais dire, mais ce serait idiot. Si vous ne l'aimez pas, faites une demande d'amélioration avec Apple. – matt

0

Vous pouvez le faire en programmant.

func switchChanged(_ sender : UISwitch!) 
{ 
     print("table row switch Changed \(sender.tag)") 
} 

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

       var cell = tableView.dequeueReusableCell(withIdentifier: "yourcellIdentifire", for: indexPath) as! UITableViewCell 

         cell.textLabel?.text = "XYZ" 
         cell.detailTextLabel?.text = "XYZ" 

         let switchView = UISwitch(frame: .zero) 
         switchView.setOn(false, animated: true) 

         switchView.tag = indexPath.row 

         switchView.addTarget(self, action: #selector(self.switchChanged(_:)), for: .valueChanged) 
// YOU CAN ALOSO ADD CONSTRAINTS HERE 

         cell.accessoryView = switchView 

       return cell 
      } 
     return UITableViewCell() 
     } 
+0

S'il vous plaît lire ma question: Je l'ai déjà fait par programmation, ne peut tout simplement pas le faire à partir de la BI. –