2017-01-03 6 views
0

Ich habe mehrere UITextFields in meinem View-Controller, der auch ein Textfeld delegieren ist. Aus irgendeinem Grund funktioniert der folgende Code nur, wenn Sie ein Textfeld auswählen, nachdem Sie nicht ausgewählt haben. Wenn ich zwischen Textfeldern wechsle, ändert sich das Textfeld, das ich verlasse, aber das, das ich gerade bearbeite, ändert sich nicht zu Rot. Ich debuggte und fand heraus, dass beide Methoden aufgerufen werden, auch wenn zwischen den beiden umgeschaltet wird, aber aus irgendeinem Grund wird nur die Farbe für die, die Sie gerade bearbeiten, nicht festgelegt. Jede Hilfe wird sehr geschätzt. Vielen Dank!So ändern Sie UITextField beim Bearbeiten

func textFieldDidBeginEditing(_ textField: UITextField) { 
    self.setTextBorder(textField: textField, color: UIColor.red) 
} 

func textFieldDidEndEditing(_ textField: UITextField) { 
    self.setTextBorder(textField: textField, color: UIColor.lightGray) 
} 

func setTextBorder(textField: UITextField, color: UIColor) { 
    let border = CALayer() 
    let width = CGFloat(2.0) 
    border.borderColor = color.cgColor 
    border.frame = CGRect(x: 0, y: textField.frame.size.height - width, width: textField.frame.size.width, height: textField.frame.size.height) 
    border.borderWidth = width 
    textField.layer.addSublayer(border) 
    textField.layer.masksToBounds = true 
} 

EDIT

Ich habe jetzt eine benutzerdefinierte Klasse zu testen und zu sehen, ob das Problem war die Tatsache, dass ich Subschichten Zugabe gehalten. Ich bekomme die gleichen Ergebnisse. Hier ist die benutzerdefinierte Textfeld Klasse I gemacht:

class SpecialTextField: UITextField { 

    var currentBorder: CALayer? 

    func setTextBorder(color: UIColor) { 
     let border = CALayer() 
     let width = CGFloat(2.0) 
     border.borderColor = color.cgColor 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) 
     border.borderWidth = width 
     if (currentBorder == nil) { 
      self.layer.addSublayer(border) 
      self.layer.masksToBounds = true 

     } else { 
      self.layer.replaceSublayer(self.currentBorder!, with: border) 
     } 
     self.currentBorder = border 
    } 

} 
+0

Sie fügen mehr und mehr Ebenen zu einem bestimmten Textfeld hinzu, wenn Sie den Fokus hin und her ändern. – rmaddy

+0

@rmaddy Das ist wahr. Ich glaube jedoch nicht, dass dies Auswirkungen haben sollte, wenn die Methode funktioniert. – Kendel

+0

@rmaddy Ich habe die Frage mit dem, was ich versucht habe zu vermeiden, wiederholt mehrere Ebenen hinzufügen. Gleiches Ergebnis. – Kendel

Antwort

0

Um die anfängliche Rahmenfarbe einzustellen, habe ich viewDidLayoutSubviews() verwendet, was das Problem verursacht hat. Es überschreibt die Ebenen, die ich während der Bearbeitung geändert habe.

0

Sie sollten Textfarbe in

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
    { 
     // textfield.backgrounColor = UIColor.yourselectedcolor 
     return true 
    } 

dann Farbe wieder zurück Delegatmethode in endEditing.

+0

Das wird nicht helfen. Das ändert den Hintergrund, wenn sie mit der Eingabe von Zeichen beginnen. Das gleiche Problem tritt immer noch auf. Aus irgendeinem Grund passiert beim Umschalten zwischen den Textansichten etwas Seltsames, das es mir nicht erlaubt, die Ebene zu ändern. – Kendel

+0

verwenden Sie irgendeine Art von Tastaturbibliothek? Tastatur in Ihrem Projekt behandeln? –

+0

Ich denke, Sie sollten versuchen, in den Versand, wenn die Funktionen aufrufen, aber UI ist nicht zur aktuellen Zeit aktualisiert. –

Verwandte Themen