2017-12-26 2 views
0

Ich habe benutzerdefinierte Steuerelement, das TextField enthält. Beispielcode sieht wie folgt aus:UITextField ohne get-Eigenschaft swift 4

@IBDesignable 
class MyTextField: UIView { 
    private var _text: String? 
    private var textField: UITextField? 

@IBInspectable var text: String? { 
    get { 
     return _text 
    } set (newValue) { 
     guard let txt = newValue else { return } 
     self._text = txt 
     //updateView() 
    } 
} 

override func awakeFromNib() { 
    super.awakeFromNib() 
    updateView() 
} 

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    updateView() 
} 

func updateView() { 
    textField = UITextField(frame: CGRect(x: 0, y: 0, width: 97, height: 30)) 
    self.addSubview(textField!) 
    textField!.text = self._text 
}} 

Wenn ich einen Ausgang zu meinen benutzerdefinierten Steuerelement in Code erstellen I set Texteigenschaft kann, aber ich kann nicht get es. Was mache ich falsch ? Ich bin neu in diesem so verstehe ich nicht ...

EDIT:

  1. hinzufügen myTextField zu Main.storyboard und Standard-Textfield
  2. eine Stelle erstellen @IBOutlet var myTextField: MyTextField! und

    standardTextField

  3. Set Text-Eigenschaft meiner Kontrolle in Objektinspektor enter image description here

  4. Meine Kontrolle über Storyboard-Updates korrekt und "Testtext" ist sichtbar
  5. eine Schaltfläche hinzufügen und einen Aktions Ausgang schaffen

    Fall 1: funktioniert

    @IBAction func Klick (_ Absender: UIButton) { myTextField.text = standardTextField.text }

    Fall 2: nicht

    @IBAction func Klick (_ Absender: UIButton) arbeiten { standardTextField.text = myTextField.text }

    Nach Fall 2, in standardTextField ist nur Wert, der i gesetzt vom Objektinspektor. Wenn i-Wert von myTextField.text ändern, zeigt standardTextField noch einen ursprünglichen Wert von Objekt-Inspektor

+0

Was meinen Sie damit, dass Sie es nicht "bekommen" können? Aufruf von 'myTextField.text' wird nicht kompiliert? – NRitH

+0

@NRitH siehe meine Bearbeitung – emerog

Antwort

0

ich das Setup in Xcode repliziert. Fall 2 funktioniert - das standardTextField zeigt den Text von MyTextField an, wenn auf die Schaltfläche geklickt wird.

Hinweis: In MyTextField ging ich davon aus, dass Sie textField einmal erstellen möchten, anstatt es jedes Mal neu zu erstellen, wenn der Text aktualisiert wird. Fall 2 arbeitete jedoch ohne diese Änderung.

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet var myTextField: MyTextField! 
    @IBOutlet var standardTextField: UITextField! 
    @IBOutlet weak var button: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     button.addTarget(self, action: #selector(click(_:)), for: .touchUpInside) 
    } 

    @IBAction func click(_ sender: UIButton) { 
     // myTextField.text = standardTextField.text // Case 1 works 
     standardTextField.text = myTextField.text // Case 2 works 
    } 
} 

myTextField Kontrolle:

import UIKit 

@IBDesignable 
class MyTextField: UIView { 
    private var _text: String? 
    private var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 97, height: 30)) 

    @IBInspectable var text: String? { 
     get { 
      return _text 
     } set (newValue) { 
      guard let txt = newValue else { return } 
      self._text = txt 
      updateView() 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.addSubview(textField) 
     updateView() 
    } 

    override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     self.addSubview(textField) 
     updateView() 
    } 

    func updateView() { 
     textField.text = self._text 
    } 
} 
+0

siehe meine Bearbeitung. Getter/Setter funktioniert nicht – emerog

+0

Danke dafür. Ich weiß immer noch nicht, was ich falsch mache. Wenn ich mit Ihren Vorschlägen änderte "create textField once" Ich habe Interface Builder Fehler: "Fehler beim Rendern und Aktualisieren des automatischen Layoutstatus für ViewController (BYZ-38-t0r): Der Agent hat eine Ausnahme ausgelöst" – emerog

+1

@emerog Überprüfen Sie den Fehler in der Konsole .app und lesen Sie das Protokoll, es könnte helfen. Der Fehler kann verschiedene Ursachen haben. Versuchen Sie alle Inits wie initFromCoder etc. zu implementieren und stellen Sie sicher, dass updateView() in jedem aufgerufen wird. Überprüfen Sie auf Konflikte in Einschränkungen. Wenn Sie Constraints im Code referenzieren, prüfen Sie, ob keine von ihnen null ist. Seien Sie vorsichtig bei der Benennung einer Klasse MyTextField, wenn sie nicht von UITextfield erbt. Das könnte ein Design-Code-Geruch sein. Dies ist eine Ansicht, die sich um ein UITextfield wickelt. Sie werden möglicherweise später oft durch den Namen dieser Klasse in die Irre geführt und haben Probleme beim Überschreiben einiger Eigenschaften. –

0

Eine einfache Lösung für nicht Getter arbeitet, ist Änderungstext Eigenschaft von:

@IBInspectable var text: String? { 
    get { 
     return _text 
    } set (newValue) { 
     guard let txt = newValue else { return } 
     self._text = txt 
     updateView() 
    } 
} 

zu

@IBInspectable var text: String? { 
    get { 
     return textField!.text 
    } set (newValue) { 
     guard let txt = newValue else { return } 
     self._text = txt 
     updateView() 
    } 
} 

Aber ich weiß nicht, ob das richtig ist ... Macht es Sinn?

Verwandte Themen