2014-06-17 48 views
0

我試圖評估一個表單字段的內容,當空的時候拋出一個錯誤。檢查長度時執行速度很差執行錯誤

這裏是出口代碼

@IBOutlet var txtUsername : UITextField! 

這裏是目標字段中的println。

println("\(txtUsername)") 

<UITextField: 0x10e8280a0; frame = (20 40; 280 30); text = ''; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x10e828b20>; layer = <CALayer: 0x10e828300>> 

所以,看這個,我會以爲txtUsername.text爲空或==「」。但是我試圖做的所有事情都會引發錯誤。

if countElements(txtUsername.text as String) != 0 { 
    ... code here 
} 

if txtUsername.text.bridgeToObjectiveC().length != 0 { 
    ... code here 
} 

if txtUsername.text.utf16count != 0 { 
    ... code here 
} 

if txtUsername.text != "" { 
    ... code here 
} 

全部帶回「EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0)

此外,評估是否是零似乎並沒有工作。下面的腳本顯示,有一些東西進行評估,即使它是空的。問題是,告訴它是否是空的。

如果該字段是零,我希望它返回false並觸發else語句。

if let evalText = txtUsername.text{ 
     println("There is something here : \(evalText)") 

    } else { 
     println("text is nil") 
    } 

// This returns "There is something here:" 

if txtUsername.text{ 
     println("There is something here") 

    } else { 
     println("text is nil") 
    } 
// This returns "There is something here" 

我甚至試圖在變量中設置該值,只是讓它在點擊「if」語句後排除錯誤。

感謝,

+1

您確定'txtUsername'已正確連接到您的插座嗎?如果'txtUsername'實際上是'nil',所有這些都會崩潰,所以你甚至不會去'.text'。 'IBOutlet'變量暗示爲'!',所以也許你不需要那個。 – Jack

+0

如果'txtUsername'已被正確導入,4個'if'分支都不會導致崩潰。 – holex

+0

連接正確。我可以毫無問題地修改這些字段。此外,該字段上的println結果將返回該字段的狀態。 –

回答

0

EXC_BAD_INSTRUCTION意味着一個斷言失敗。當有東西是nil時,這是最常見的,但您仍然試圖對其進行操作。

UITextFieldtext財產是Implicitly Unwrapped OptionalString!)。你必須首先檢查它是否是nil。你的應用崩潰了,因爲它是nil

0

txtUsername.text在Swift中是可選的。即使您的標籤是可選的,因此在聲明時使用!並不安全。但無論如何,請嘗試使用此:

if let currentText = txtUsername.text { 
    // ... Do something with currentText ... 
} 
else { 
    NSLog("Text is nil") 
} 

要格外肯定你甚至可以檢查是否txtUsername被以同樣的方式設置。所以,最後你都會有這樣的:

if let currentTxtUsername = txtUsername{ 
    if let currentText = currentTxtUsername.text { 
     // ... Do something with currentText ... 
    } 
    else { 
     NSLog("Text is nil") 
    } 
} 
else { 
    NSLog("Text label is nil") 
} 

不要忘記刪除在聲明部分!雖然。

0

原來是一個錯誤重影問題。

實際的問題是,它會在代碼中進一步下降,並遇到我無意中嘗試將來自核心數據對象的零數據放回到文本字符串中的情況。將文本字段設置爲零不起作用,但不是出現問題的地方,而是錯誤地出現在它上面的「if」語句中。

以下是完整的代碼和問題的一些描述。

@IBAction func btnLoad(sender : AnyObject) { 

    var appDel = (UIApplication.sharedApplication().delegate as AppDelegate) 
    var context = appDel.managedObjectContext 
    var request = NSFetchRequest(entityName: "Users") 
    request.returnsObjectsAsFaults = false 


    // Here is the place where it throws the error. 
    if txtUsername.text == "" { 
     request.predicate = NSPredicate(format: "username = %@", "\(txtUsername.text)") 
    } 


    var results = context.executeFetchRequest(request, error: nil) 

    println(results) 

    if(results.count > 0){ 

     var res = results[0] as NSManagedObject 

     println("\(res)") 

     //*** The database had nil values for the result selected. And nil doesn't go into a text field. 
     txtUsername.text = res.valueForKey("username") as String 
     txtPassword.text = res.valueForKey("password") as String 

     responseLabel("User Found") 

    } else { 
     responseLabel("No Users Found") 
    } 

} 

謝謝大家的回覆。