2014-06-17 44 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") 
    } 

} 

谢谢大家的回复。