2014-11-18 16 views
5

So habe ich Ziele zu meinen IBActions hinzugefügt, die auftreten, wenn sich der Wert eines Textfelds ändert. Wenn diese Aktionen auftreten, sollte das System überprüfen, ob die beiden Textfelder beide Ganzzahlen sind. Ich habe zwei Variablen auf false gesetzt, und sie sind auf wahr gesetzt, wenn beide ein int sind. In den IBActions habe ich if-Anweisungen, die angeben, dass eine Schaltfläche aktiviert werden soll, wenn beide Variablen Ganzzahlen enthalten. Wenn ich den Simulator ausführe, wird diese Schaltfläche nicht aktiviert, wenn beide Textfelder eine ganze Zahl enthalten.Swift: Wertverändernde Steuerereignisse werden nicht aufgerufen?

Ich bin neu zu schnell, also wenn möglich, schreiben Sie bitte den gesamten Code aus und wo es in meinem Code sein sollte. Hier ist, was ich bisher:

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var calculatorButton: UIButton! 
@IBOutlet weak var inspirationLabel: UILabel! 
@IBOutlet weak var beginningLabel: UILabel! 
@IBOutlet weak var calculatorContainer: UIView! 
@IBOutlet weak var answer1Label: UILabel! 
@IBOutlet weak var doneButton: UIButton! 
@IBOutlet weak var yourWeightTextField: UITextField! 
@IBOutlet weak var calorieNumberTextField: UITextField! 
@IBOutlet weak var menuExampleButton: UIButton! 
@IBOutlet weak var aboutButton: UIButton! 
@IBOutlet weak var calculateButton: UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib 
    yourWeightTextField.delegate = self 
    calorieNumberTextField.delegate = self 
    calculateButton.enabled = false 
    // Calling the textfield valueChanged Methods 
    yourWeightTextField.addTarget(self, action:"yourWeightValueChanged:", forControlEvents:.ValueChanged); 
    calorieNumberTextField.addTarget(self, action:"calorieNumberValueChanged:", forControlEvents:.ValueChanged); 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func calculatorButtonTapped(sender: AnyObject) { 
    calculatorContainer.hidden = false 
    inspirationLabel.hidden = true 
    beginningLabel.hidden = true 
    menuExampleButton.hidden = true 
    aboutButton.hidden = true 
} 

var yourWeightFilled = false 
var calorieNumberFilled = false 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    // Find out what the text field will be after adding the current edit 
    let text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string) 

    // If the textfields have the properties of the function 
    if textField == yourWeightTextField { 
     yourWeightFilled = text.toInt() != nil 
    } else if textField == calorieNumberTextField { 
     calorieNumberFilled = text.toInt() != nil 
    } 

    return true 
} 

func textFieldShouldReturn(textField: UITextField) -> Bool 
{ 
    textField.resignFirstResponder(); 
    return true; 
} 

// The methods to close the keyboard when editing is finished 
@IBAction func yourWeightEditingDidEnd(sender: AnyObject) { 
    yourWeightTextField.resignFirstResponder() 
} 

@IBAction func calorieNumberEditingDidEnd(sender: AnyObject) { 
    calorieNumberTextField.resignFirstResponder() 
} 

@IBAction func yourWeightValueChanged(sender: AnyObject) { 
    // If both variables are true and the text fields contain integers, enable button 
    if self.yourWeightFilled && self.calorieNumberFilled { 
     self.calculateButton.enabled = true 
    } 
} 
@IBAction func calorieNumberValueChanged(sender: AnyObject) { 
    // If both variables are true and the text fields contain integers, enable button 
    if self.yourWeightFilled && self.calorieNumberFilled { 
     self.calculateButton.enabled = true 
    } 
} 
} 

Antwort

9

Sie für EditingChaged Ereignis aussehen sollte, nicht ValueChanged

EDIT: Was ich meine, ist zu ändern, von:

yourWeightTextField.addTarget(self, action:"yourWeightValueChanged:", forControlEvents:.ValueChanged); 
calorieNumberTextField.addTarget(self, action:"calorieNumberValueChanged:", forControlEvents:.ValueChanged); 

zu:

yourWeightTextField.addTarget(self, action:"yourWeightValueChanged:", forControlEvents:.EditingChanged); 
calorieNumberTextField.addTarget(self, action:"calorieNumberValueChanged:", forControlEvents:.EditingChanged); 

Sie suchen einfach nach falschen Vorabend nt.

+0

Sie haben ein 'n' auf 'EditingChanged' im zweiten Codebeispiel vergessen. – adheus

+0

@adheus - behoben, danke. – Piotr

+0

@Piotr aber es funktioniert nur, wenn ich Textfeld mit der Tastatur bearbeiten. Was muss ich tun, wenn ich das Textfeld mit einem Klick ändern muss? – MHSFisher

2

Wenn Sie nach einem Text geändert Ereignis suchen, dann Rechts auf dem Textfeld klickenwählen Did Editierendpunkt von den Sent Events. Sie können einen Kreis auf der rechten Seite sehen Ende Klicken Sie auf den Kreis Halten Sie die Strg-Taste und ziehen Sie es in Ihre ViewController-Datei. Nennen Sie die gewünschte Aktion und Click connect. Ich habe dafür einige Screenshots zur Verfügung gestellt. Hier nenne ich die Aktion Textchanged

ich verwende Xcode 7 Swift 2 hier

Rechts auf das Textfeld klicken und Sie können sehen, so etwas wie dieses enter image description hereenter image description here

Schließlich Sie das sehen können TextChanged-Ereignis Erstellt. Wenn Sie etwas in ein Textfeld eingeben und auf Zurück klicken, wird dieses Ereignis ausgelöst.

Verwandte Themen