2017-10-19 5 views
1

Je me bats avec mon UISwitch dans unpersonnalisé.Pourquoi changer de commutateur dans TableViewCell affecte-t-il d'autres commutateurs dans d'autres cellules?

Le commutateur du UITableViewCell ajoute l'élément de la cellule à un autre tableau. Cependant, j'ai remarqué que lorsque je change un commutateur, il change également d'autres commutateurs dans d'autres cellules.

Je crois que le problème est avec la fonction TableView dequeueReusableCell.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "currencyCell") as? currencyCell else { return UITableViewCell() } 
} 
+1

Ce n'est pas assez de code pour dire quel est le problème, mais je suppose que vous ne réinitialisez pas la valeur de 'UISwitch' dans votre méthode' tableView: cellForRowAt: 'avant de retourner la cellule? – TawaNicolas

+0

Veuillez expliquer brièvement quelle est votre question? – Zee

+0

Bonjour TawaNicolas, vous avez raison, je n'ai pas réussi à le réinitialiser. Peux-tu me dire comment le faire? Je peux y accéder via "cell.switchBtn (UISwitch)". Cependant, je ne sais pas quoi mettre (UISwitch) partie. Merci beaucoup! – sc13

Répondre

1

Vous avez stocker quelque part la valeur de l'interrupteur « en dehors » du UITableviewCell pour pouvoir le remettre à la dernière valeur que le commutateur spécifique était dans cette cellule. Je recommande de l'enregistrer à partir de la cellule (par exemple, lorsque la valeur UISwitch's est modifiée) avec un modèle de délégué. Ensuite, définissez-le à partir de la fonction tableView:cellForRowAt: après avoir défini la cellule.

+0

Bonjour Bence, En fait, j'ai déjà été manipulé en réglant UISwitch avec la méthode déléguée dans la cellule prototype. Cependant, je ne pouvais pas trouver un moyen de le définir à tableView: cellForRowAt: fonction avant la cellule de retour. La seule option que j'obtiens est "cell.switchBtn (UISwitch)". Alors, comment puis-je définir ceci à isOn == false pour que les nouvelles cellules ne soient pas affectées. Merci beaucoup! – sc13

+0

A propos de cela, lisez cet article pls: https://makeapppie.com/2016/10/17/custom-table-view-cells-in-swift-3/ –

+0

Bonjour Bence, j'ai lu l'article, mais il a fait ne mentionne pas la valeur changeante des enfants de Prototype Cell. Je veux juste savoir comment je peux changer la valeur de UISwitch dans TableView: cellForRowAt avant de retourner de nouvelles cellules. Merci pour votre temps et vos réponses. Très appréciée. – sc13

-1

J'ai également eu le même problème. Demandé à un développeur senior, et il a suggéré que parce que dans les cellules UITableView sont réutilisés. Quand on change l'état du premier UISwitch dans le UITableView sur ON et défile vers le bas, la cellule avec le premier commutateur est réutilisée, par conséquent certains des commutateurs suivants sont affichés comme ON par défaut.

Si vous activez le premier UISwitch ON, l'état des autres commutateurs du UITableView ne change pas. Au lieu de cela, le premier commutateur est en cours de réutilisation. Donc, la solution à ceci serait de lier le UISwitch dans chaque cellule avec quelques données. A titre d'exemple (pseudocode):

procédé
public class ABC: UITableViewCell 
{ 
    . 
    . 
    . 
    . 
    public void UpdateCell(bool switchStatus) 
    { 
     SwitchInCell.On = switchStatus 
    } 
} 

UpdateCell est appelé à partir d'une classe qui hérite UITableViewSource classe.

(Note:... Je suis de C# et fond de développement pour iOS à l'aide Xamarin donc ci-dessus est en pseudocode C#, mais peut être très facilement transféré à Swift)

J'espère que cela a aidé.