2017-03-08 26 views
0

我對iOS應用程序編程非常陌生(剛剛在一週前開始學習!),所以我確定我要問的是非常明顯的!XCode8/Swift不會讓我設置textField的文本等於一個字符串?

因此,我正在爲我的工作學習職位申請工作,並且無法爲我的生活弄清楚我做錯了什麼。基本上,我想要做的就是在允許用戶繼續前確認每個字段是否已填滿。我在另一個視圖控制器中做了類似的事情,以檢查輸入的內容是否與我爲該程序設置的密碼相同(我相信有更好的方法可以做到這一點,但是因爲我是自學的,而且是我的第一個應用程序,我並不擔心太多,我有一整年的時間來打磨它!)

這是代碼(如果你有建議可以改善它,感覺自由,但大多數情況下,我只是想弄清楚爲什麼這個工作和其他的代碼不是)

@IBAction func enterPassword(_ sender: Any) { 

    pw = password.text! 
    let message = "Incorrect Password" 

    if(pw == "RISE") 
    { 
     performSegue(withIdentifier: "ToMenu", sender: self) 
    } 
    else { 
     incorrect.text = message 
    } 
} 

請注意變量「私服」是一個全局變量,並且聲明的類之外。密碼和不正確都是先前聲明的標籤。

這裏是有問題的代碼。我不明白爲什麼我得到這個錯誤。它是「線程1:exc_bad_instruction」。我真的不知道這個錯誤是什麼意思,所以如果你碰巧知道它是什麼意思,請賜教!我將這個問題包含在viewController的所有代碼中。

import UIKit 


var studName = " " 
class CreateViewController: UIViewController { 

@IBOutlet weak var name: UITextField! 
@IBOutlet weak var ID: UITextField! 
@IBOutlet weak var YR: UITextField! 
@IBOutlet weak var test: UILabel! 


@IBAction func endCreate(_ sender: Any) { 
    studName = name.text! 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

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

/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 
} 

我在做什麼錯在這裏?我非常不確定和困惑。我非常擅長使用Java和C++進行編碼,所以我從來沒有想過會有學習上的問題,但它完全不同,所花的時間比我預期的要長很多(花了我大約一週的時間學習C#...)。

感謝您的幫助!

編輯: (我需要10的聲譽後兩個以上的鏈路,所以我刪除了錯誤LOL我想我會去回答一些問題什麼的。)

Click here to see StoryBoard

Click here to see Connection to NAME (note I reconnected it and used all caps, error is still an issue)

如果有任何其他信息可能會幫助您理解,請讓我知道!謝謝!

+0

你可以發佈你正在發生的錯誤和它發生的地方的截圖嗎? –

+0

沒有看到更多,這聽起來像你的名字出口沒有連接。 – BJHStudios

+0

問題可能會縮短以吸引更多關注。無論如何,在哪一行你會得到錯誤? –

回答

1

我假設在這裏,您遇到這條線

studName = name.text! 

崩潰? (如果不是你能不能請包括堆棧跟蹤,指示你在哪裏得到一個問題?)

看起來要麼namenil,或textnil兩者被解開力這裏。所以要麼你沒有在界面生成器中正確連接這個文本域,要麼沒有文本。

我的一般原則是(我敢肯定,人們會同意這種看法):

不要使用!

這樣一個簡單的規則:)

我之所以這樣說,迫使展開從不(非常非常罕見)需要一個可選的變量,並暗示這是顯然是被允許是零(否則它不會是可選)值的假設。通常,如果你發現自己使用!對自己的變量之一,考慮重構的變量不能是可選的,否則大量使用可選的約束力和/或保護聲明,以避免強迫的事情。 (我對此的一個主要警告是創建實例變量,它需要自身作爲初始化參數,其中實例變量是隱式解包的可選項,但是在調用超級初始化程序之後立即設置,並且從不再次)

此外,雖然它的工作原理,是有效的代碼,這是不是典型的使用全局變量的東西像studName,這應該是在你的控制器的一個實例變量。

不要隨意喊,如果你有關於這個(或任何的iOS/SWIFT)任何其他問題。如果你是剛剛開始,我不能建議http://web.stanford.edu/class/cs193p高度不夠!全面瞭解所有核心iOS技術和設計模式。

編輯評論

在這種情況下,你可能會避免讓你的變量可選該!,你可以使用

​​

這使它成爲一個可選的變量,它允許你聲明studName給它分配一個零值。

如果你確信你不希望它是零,你也可以做你的任務作爲

studName = name.text ?? " " 

這將檢查的name.text的價值,如果它是不nil分配到studName,否則它會在右邊" "賦值。它基本上允許您爲不可選的分配提供默認值。它是簡寫:

if let text = name.text { 
    studName = text 
} else { 
    studName = " " 
} 
+0

是的,那是我遇到問題的地方。無論我的文本字段中有什麼名字,我的應用都崩潰了。別人說它沒有連接,我會再試一次。但是,當我搞砸了,我怎麼能不使用「!」?我很樂意不使用它,但是如果我不這樣做,我會得到一個錯誤。 –

+0

重新連接它不起作用。我的程序中是否還有其他功能可以幫助您找出應用程序爲什麼會崩潰? –

+0

@AmberRebeccaHowe嗯,你可能會添加一個'print(studName)','print(name)'和'print(name.text)'在崩潰的那一行上面,這應該會有一些亮點嗎? –

-1

首先,

取爲TextField出口如下所示

// MARK:- IBOutlets 
    @IBOutlet var passwordTextField: UITextField!` 

利用了按鈕&分配IBAction爲按鈕, 「passwordCheck」 在此案件。 您可以比較TextField文本字符串如下圖所示

// MARK:- IBActions 
@IBAction func passwordCheck(_ sender: Any) { 
    if passwordTextField.text == "RISE" { 
     print("perform Segue") 
    } else { 
     print("Do nothing") 
    } 
} 

讓我知道如果您有任何疑問...

+0

密碼代碼的作品,實際上!我會考慮你的建議。我添加的代碼的第二部分是否有任何內容可以幫助我?行「studName = name.text!」正在讓我的應用程序崩潰。 –

+0

@AmberRebeccaHowe據我所知,該部分沒有問題。爲了確保我完成了你完成的工作,它爲我工作。請參閱下面的鏈接。 –

+0

[IMG] http://i65.tinypic。COM/20j65hj.jpg [/ IMG] –

0

偉大的開始。下面是我將如何寫它:

@IBAction func enterPassword(_ sender: Any) { 

     //Make sure we trim off any white space or new lines and then optionally bind the text in the text field. 
     guard let passwordText = self.password.text?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) else { 
      self.incorrect.text = "Please enter a password." 
      return 
     } 
     //Make sure text is not a blank string eg: "" 
     guard !passwordText.isEmpty else { 
      self.incorrect.text = "Please enter a password." 
      return 
     } 
     //Make sure it is the password we want. 
     guard passwordText == "ThePassword" else { 
      self.incorrect.text = "Not the correct password." 
      return 
     } 

     //Success! Do other stuff here. Like perform a segue. 

} 

而只是爲了好的措施和一點樂趣。這裏是UITextField的一個很好的擴展,如果有什麼是無效的,提供一個很好的小動搖動畫。

extension UITextField { 
    func shake(times T: Int, distance D: CGFloat) { 
     UIView.animate(withDuration: 0.06, animations: { 
     self.transform = CGAffineTransform(translationX: D, y: 0) 
     }) { (didComplete) in 
     UIView.animate(withDuration: 0.06, animations: { 
      self.transform = CGAffineTransform.identity 
     }, completion: { (didComplete) in 

      guard T > 0 else { 
       return 
      } 
      self.shake(times: T - 1, distance: D) 
     }) 
     } 
    } 
} 

George Green是對的。在Swift中強制展開被認爲是代碼異味。始終可選地綁定一個可選值。使一些更詳細的代碼,但保持一切安全。

+0

去包裹是不是一個代碼味道,但合法的操作。你只需要正確的決定時,你可以強制解纏,並認識到崩潰,當它發生。 – Sulthan

+0

@Sulthan未按前[在第一谷歌搜索結果項目](https://cocoacasts.com/five-signs-of-code-smell-in-swift/)「快速代碼味道」 –

+0

該博客帖子不說*從不使用強制解包*。它說*謹慎使用*。該操作符存在於Swift中是有原因的。 – Sulthan

0

你走了......在這裏我看到了問題。我將Outlet刪除到TextField,並立即看到該錯誤。 See error here

請確保您正確連接IBOutlet,它的工作原理如下所示。 See how it works

希望這有助於你。

+0

也許我不知道如何連接它...?我持有控制權並將其拖到代碼並選擇出口。我有一種感覺,它可能有其他問題... –

+0

@AmberRebeccaHowe你可以給我發送TextField IBOutlet連接的截圖(在Textfield和Code上都有)。 –

相關問題