2017-05-28 21 views
0

Ich kann den Code nicht erkennen, wenn die Textfelder HourGoal und MinuteGoal leer sind. Sie werden nie mit einem Nullwert oder leer angezeigt, was dazu führt, dass das Programm abstürzt, wenn ich versuche, die Werte auszupacken.erkennt Textfeld nicht als leer

import UIKit 

class ReadingGoal: UIViewController { 
    @IBOutlet weak var HourGoal: UITextField! 
    @IBOutlet weak var MinuteGoal: UITextField! 
    @IBOutlet weak var NextButton: UIButton! 
    var mingoal = Int() 
    var hrgoal = Int() 
    var secondstoread:Int = 0 
    var initialtime:Int = Int() 

    @IBAction func HourEditingDidChange(_ sender: Any) { 
     NextButton.isEnabled = true 
    } 

    @IBAction func MinuteEditingDidChange(_ sender: Any) { 
     NextButton.isEnabled = true 
    } 

    func disable() { 
     NextButton.isEnabled = false 
    } 

    @IBAction func NextButtonIsPressed(_ sender: Any) { 
     print("GERALDINE IS AWESOME!!!!!") 

     // ERROR 
     if HourGoal.text?.isEmpty == false || MinuteGoal.text?.isEmpty == false { 
      if HourGoal.text != nil && HourGoal.text?.isEmpty == false{ 
      // self.hrgoal = Int(HourGoal.text!)! 
       print("hr Value exists") 
       print("\(HourGoal.text!)") 
      } 
      else { 
       NextButton.isEnabled = false 
      } 
      if MinuteGoal.text != nil && MinuteGoal.text?.isEmpty == false{ 
       // self.mingoal = Int(MinuteGoal.text!)! 
       print("min value exists") 
       print("\(MinuteGoal.text!)") 
      } 
      else { 
       NextButton.isEnabled = false 
      } 
      print("in ") 
      // secondstoread = ((mingoal + (hrgoal*60))*60) 
      secondstoread = 10 

      if secondstoread > 0 { 
       performSegue(withIdentifier: "Mr.Friar-DavisIsAGiantBallOfFloof", sender: self) 
      } 
      else { 
       NextButton.isEnabled = false 
      } 
      //function saves text field info to core data 
     } 
    } 

    //for the specific segue 'toBookInfo', certain information is passed through the segue 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     //making sure we are using correct segue 
     if segue.identifier == "Mr.Friar-DavisIsAGiantBallOfFloof" { 

       //selecting the destination controller 
       let detailVC: TimerController = segue.destination as! TimerController 

       //sending properties to destination view controller 
       detailVC.seconds = secondstoread 
      } 
    else { 
      // Error sender is not a cell or cell is not in collectionView. 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     initialtime = secondstoread 
    } 
} 

Antwort

0

Wollen Sie nicht hier Terminologie unterrichten, aber alle Variablen sollten mit Klein wie folgt beginnen, auch die IBOutlets ...

... Okay ich Ihren Code für eine Weile untersucht:

VERMEIDEN SIE VERWENDUNG EXLAMATION MARK ZU JEGLICHEN KOSTEN !!! -> Der Grund, es stürzt viel ab, weil Sie verwenden! Überall entfaltet diese Kraft die Optionen und ruiniert total die Schönheit von swift.

Wie funktioniert diese Zeile mit Compiler, der kein Problem mit Optionals hat?

if HourGoal.text?.isEmpty == false || MinuteGoal.text?.isEmpty == false 

Sie irgendwie optionaler Wert werden überprüft und der Wert ist auf jeden Fall gleich Null, also, bevor die Codezeile bieten:

guard let hourGoalText = HourGoal.text, let minuteGoal = minuteGoal.text else { //handle code for empty textField 
return } 

Dieser erste Schritt ist optionals zur Überprüfung ... jetzt der Code gewonnen‘ t Absturz ... Aber mal ehrlich, ohne

zu debuggen

, wenn Sie die Wache verwenden lassen oder wenn Aussagen lassen, werden Sie keine Probleme haben mit

Absturz
0

SieüberprüfenLeere auf verschiedene Arten. Einige von ihnen sind:

if textField.text?.isEmpty ?? true{ 
    print("textField is empty") 
} 
else{ 
     print("textField has some text") 
} 

oder

if textfield.text?.characters.count==0 { 
    print("textField is empty") 
} 
else{ 
    print("textField has some text") 
} 

oder

if textfield.text == "" { 
    print("textField is empty") 
} 
else{ 
    print("textField has some text") 
} 
0

Verwenden if let oder guard in gesicherter Weise auspackt. So etwas wie dieses

if let texthour = HourGoal.text{ 
     // has text and can be "", next check for blank string 
     if texthour == ""{ 

    } 
} 

OR verwenden guard als Dominik zeigt

Verwandte Themen