我使用Firebase使用最后一条消息创建了这个简单的聊天应用程序,但我一直遇到此错误,似乎无法通过它。我检查了许多像@IBOutlets这样的东西,但我似乎无法解决问题。任何人都可以帮我修复"致命错误:在打开一个可选的"时,意外地发现了nil。问题是,我似乎无法找到任何可选项开始,因为一切都只是它的常规数据类型或者像@IBOutlets一样被低估了。下面是我的一个视图控制器的代码:导致应用程序崩溃的代码。任何帮助都会很棒或者建议指导方向。谢谢!
import UIKit
import Firebase
class ViewTwo : UIViewController {
var ref: Firebase!
var REF: Firebase!
@IBOutlet weak var readMsg: UILabel!
@IBOutlet weak var msg: UITextField!
@IBOutlet weak var nameField: UITextField!
@IBAction func sendMsg(sender: AnyObject) {
nameField.resignFirstResponder()
if nameField.text == "ETHAN" {
ref = Firebase(url: "my-app/Person1Msg")
ref.setValue("\(msg.text)")
REF = ref
} else if nameField.text == "CHASE" {
ref = Firebase(url: "my-app/Person2Msg")
ref.setValue("\(msg.text)")
REF = ref
} else {
msg.placeholder = "Please enter name ALL CAPS"
}
}
override func viewDidAppear(animated: Bool) {
REF.observeEventType(.Value) { (snap: FDataSnapshot!) in
self.readMsg.text = snap.value as? String
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
}
这是我的另一个和唯一的其他视图控制器内的代码,但没有找到错误:
class ViewController : UIViewController {
var accepted: Bool = false
@IBOutlet weak var nameField: UITextField!
@IBAction func submit(sender: AnyObject) {
nameField.resignFirstResponder()
if nameField.text == "CHASE" || nameField.text == "ETHAN" {
accepted = true
} else {
nameField.placeholder = "Please enter correct name ALL CAPS"
}
}
@IBAction func start(sender: AnyObject) {
nameField.resignFirstResponder()
if accepted == true {
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let nextViewController : UIViewController = storyboard.instantiateViewControllerWithIdentifier("ViewTwo") as UIViewController
self.presentViewController(nextViewController, animated: true, completion: nil)
} else {
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}
override func viewDidLoad() {
super.viewDidLoad()
accepted = false
}
}
答案 0 :(得分:1)
在ViewTwo类中,在viewDidAppear func中,有一个尚未完全定义的REF:
override func viewDidAppear(animated: Bool) {
REF.observeEventType(.Value) { (snap: FDataSnapshot!) in
if let msg = snapshot.value as? String {
self.readMsg.text = msg
}
}
}
此时,REF仅定义为REF:Firebase!。
因此,当视图出现时,它将尝试为没有引用的REF调用observeEvent。
在调用sendMsg函数之前,REF尚未完全定义。
此外,您可能希望在readMsg分配中添加一些错误检查:
enum
答案 1 :(得分:0)
根据您的代码var ref: Firebase!
,ref需要一个值。但是,在条件语句中,红色可能没有值。在你的viewDidLoad的最后一个声明中,Xcode致命地发现ref为零。尝试在条件之前指定var ref = Firebase(url:"https://yourappurl.firebaseio.com")
。