2017-02-16 3 views
1

Ich verwende Xcode 8 und Swift 3.Swift: Wie bei gleichzeitig zwei func Textfeld verwenden

Ich habe ein Projekt mit drei Textfelder, 1-Taste zu löschen und Etikett Ergebnis anzuzeigen.

Innerhalb meiner Klasse Viewcontroller ich habe:

class ViewController: UIViewController,UITextFieldDelegate { 

@IBOutlet weak var input1: UITextField! 
@IBOutlet weak var input2: UITextField! 
@IBOutlet weak var input3: UITextField! 
@IBOutlet weak var lblResult: UILabel! 
@IBOutlet weak var clearButton: UIButton! 

Ich möchte meine Textfelder Eingänge bis max 3 Stellen beschränken, sondern auch auf einen Wert von 360. Ich schaffe Code für beide Dinge zu bekommen und sie funktionieren, wenn verwendet, nur eins nach dem anderen, aber weil beide mit func textfield beginnen, kann ich sie nicht beide zusammen arbeiten lassen. Muss ich es in einer anderen Klasse machen? Ich weiß, das ist eine grundlegende Frage, aber ihr Teil des Lernprozesses.

Dies sind die beiden Codes ich kombinieren möchten:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
       replacementString string: String) -> Bool 
{ 
    let maxLength = 3 
    let currentString: NSString = textField.text! as NSString 
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString 
    return newString.length <= maxLength 
} 

und:

func textField(_ textField: UITextField, 
       shouldChangeCharactersIn range: NSRange, 
       replacementString string: String) -> Bool 
{ 
    var startString = "" 
    if (textField.text != nil) 
    { 
     startString += textField.text! 
    } 
    startString += string 
    let limitNumber = Int(startString) 
    if limitNumber! > 360 
    { 
     return false 
    } 
    else 
    { 
     return true; 
    } 
} 

Sie sind beide in der Klasse Viewcontroller.

Danke für die Hilfe!

+0

Für dieses Szenario, ich glaube nicht, dass Sie identifizieren müssen, welche 'Textfeld 'ist welche. Alle Variablen innerhalb dieser Funktionen sind lokal. Dies sind Funktionen von 'UITextFieldDelegate'. Setzen Sie sie für alle UITextFields auf "self"? – KrishnaCA

Antwort

1

Wenn ich mich nicht täusche, hier ist alles, was Sie brauchen:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
       replacementString string: String) -> Bool { 
    let maxLength = 3 
    let limitValue = 360 

    let text = textField.text! 
    let currentString: NSString = text as NSString 
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString 

   var startString = "" 

    if !text.isEmpty { 
     startString += text 
    } 
    startString += string 

    let limitNumber = Int(startString)! 

    return limitNumber < limitValue && newString.length <= maxLength 
} 

Update:

Autofokus auf einem nächsten texfield.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
        replacementString string: String) -> Bool { 
    let maxLength = 3 
    let limitValue = 360 

    let text = textField.text! 
    let currentString: NSString = text as NSString 
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString 

   var startString = "" 

    if !text.isEmpty { 
     startString += text 
    } 
    startString += string 

    let limitNumber = Int(startString)! 

    let newLength: Int = newString.length 

    if textField == input1 { 
     if newLength == maxLength { 
      input2.becomeFirstResponder() 
     } 
    } 
    if textField == input2 { 
     if newLength == maxLength { 
      input3.becomeFirstResponder() 
     } 
    } 

    if textField == input3 { 
     if newLength == maxLength { 
      self.view.endEditing(true) 
     } 
    } 

    return limitNumber < limitValue && newLength <= maxLength 
} 
+0

Es funktionierte wie ein Charme! Vielen Dank Javimuu! – FONSPA

+0

Sie sind willkommen :) – javimuu

+0

Btw wissen Sie auch, wie Sie den Cursor vom ersten Textfeld zum zweiten und so weiter schalten, wenn ich die 3 Ziffern einfügte? Danke – FONSPA

1

Sie benötigen einen if statement in func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool Überprüfung des aktuellen textField wie folgt hinzuzufügen:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    if textFiled == input1 { 
    // do logic for input1 
    } else if textFiled == input2 { 
    // do logic for input2 
    } 
} 
1

Swift switch Aussage wird es tun.

func textField(_ textField: UITextField, 
       shouldChangeCharactersIn range: NSRange, 
       replacementString string: String) -> Bool 
{ 
    switch textField { 
    case input1: 
     // ... 
    case input2: 
     // ... 
    case input3: 
     // ... 
    default: 
     break 
    } 
} 
0

Die Leute haben die Frage nicht verstanden. Eigentlich brauchen Sie nur Ihre Aussage, wie von javimuu erwähnt, zusammenzuführen.

Meine Antwort ist schrecklich, da javimuus eine korrekt ist, aber ich schreibe sie, weil ich nicht genug Rep habe, um jene Leute abzustimmen, die sich auf nutzlose Weise abstimmen.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
       replacementString string: String) -> Bool 
{ 
    let maxLength = 3 
    let currentString: NSString = textField.text! as NSString 
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString 

    var startString = "" 
    if (textField.text != nil) 
    { 
     startString += textField.text! 
    } 
    startString += string 
    let limitNumber = Int(startString) 


    return newString.length <= maxLength && limitNumber! <= 360 
} 
+0

Nicht wirklich. Die Rendite ist nicht die gleiche und ist genauer mit den Bedürfnissen von FONSPA. Aber global, ja, stimme ich zu, es sieht so aus. – Acrasia

+0

Nicht meine Angelegenheit. Es ist direkt aus dem Code von FONSPA. Ich habe den Komponententest nicht ausgeführt, um zu überprüfen, ob seine Funktion korrekt ist. Ich beantworte nur seine eigentliche Frage. – Acrasia

+0

Nicht wirklich.Die Rendite ist nicht die gleiche und ist genauer mit den Bedürfnissen von FONSPA. Aber global, ja, ich stimme zu, es sieht so aus: – Acrasia

Verwandte Themen