Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
firebase ios聊天应用程序不工作_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

firebase ios聊天应用程序不工作

firebase ios聊天应用程序不工作,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个tableViewController,其中包含登录用户与他/她选择的任何用户之间的消息列表。单击该单元格时,它应转到允许登录用户与任何用户聊天的视图控制器。我已经设置了一个覆盖序列: var userpicuid: String? var username: String? override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let mes

我有一个tableViewController,其中包含登录用户与他/她选择的任何用户之间的消息列表。单击该单元格时,它应转到允许登录用户与任何用户聊天的视图控制器。我已经设置了一个覆盖序列:

var userpicuid: String?
var username: String?

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

         let message = messages[indexPath.row]

        if message.ReceiverId != self.loggedInUserUid {
            var newVariable = message.ReceiverId

            if self.userpicuid ==  newVariable {

                let ref = FIRDatabase.database().reference().child("users").child(userpicuid!)

                ref.observeSingleEvent(of: .value, with: { (snapshot)
                    in

                    if let dictionary = snapshot.value as? [String: AnyObject]{
                        for post in dictionary {
                            let messages = post.value as! [String: AnyObject]
                            for (id, value) in messages {

                                self.username = messages["username"] as? String


                            }}}})}} else if message.senderId != self.loggedInUserUid {
            let newVariable = message.senderId

            if self.userpicuid ==  newVariable {

                let ref = FIRDatabase.database().reference().child("users").child(userpicuid!)

                ref.observeSingleEvent(of: .value, with: { (snapshot)
                    in

                    if let dictionary = snapshot.value as? [String: AnyObject]{
                        for post in dictionary {
                            let messages = post.value as! [String: AnyObject]
                            for (id, value) in messages {

                                self.username = messages["username"] as? String
                            }}}})}

        }

    performSegue(withIdentifier: "MessageNow", sender: self.userpicuid)

}


override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "MessageNow", let chatVc = segue.destination as? SendMessageViewController else {
        return
    }

    chatVc.senderId = self.loggedInUser?.uid
    chatVc.receiverData = sender as AnyObject
    chatVc.senderDisplayName = self.userpicuid
    chatVc.username = self.username

}
在目标视图控制器中,这是设置:

var receiverData: AnyObject?

override func viewDidLoad() {
        super.viewDidLoad()

        self.senderId = FIRAuth.auth()?.currentUser?.uid

 let receiverId = receiverData as! String
        let receiverIdFive = String(receiverId.characters.prefix(5))
        let senderIdFive = String(senderId.characters.prefix(5))
        if (senderIdFive > receiverIdFive)
        {
            self.convoId = senderIdFive + receiverIdFive
        }
        else
        {
            self.convoId = receiverIdFive + senderIdFive
        }}

我收到错误,无法将“Lit_Swap.MessageTableViewCell”(0x1091d0f10)类型的值强制转换为“NSString”(0x10b153c60)。由于发送者显然是tableviewcell,我将如何设置发送者,使其允许我单击该单元格并进入聊天控制器。

有很多方法可以在视图之间移动数据,一种是segue,还有许多选项可供选择

这里有一个使用representedObject属性的

假设我们有一个带有文本字段的视图控制器和一个触发secondSheetController操作的按钮

class ViewController: NSViewController {

   @IBOutlet weak var sourceTextField: UITextField!

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
       let second = segue.destinationController as! SecondController
       second.representedObject = self.myTextField.text
   }
}
还有我们要去的viewController

class SecondController: NSViewController {

   @IBOutlet weak var targetTextField: NSTextField!

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   override func viewWillAppear() {
       self.targetTextField.text = self.representedObject as! String
   }
}
此外,为了解决发送方是否是字符串并且我们不想使用representedObject属性的问题,将字符串赋值将是一个解决方案

chatVc.receiverData = sender as! String
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedConversation = conversationArray[indexPath.row]
    showConversationMessages(conversation: selectedConversation)
}


func showConversationMessages(conversation: ConversationItem){
    let vc = storyboard?.instantiateViewController(withIdentifier: "MessagesViewController") as! MessagesVC
    vc.receiverId = conversation.idMessagePartner
    vc.receiverToken = conversation.receiverToken
    vc.receiverUserName = conversation.userDisplayName
    navigationController?.pushViewController(vc, animated: true)
}
作为第三个选项,可以直接设置SecondController中的任何类变量

class SecondController: NSViewController {
   var option1 = ""
   var option2 = ""
然后从第一个视图控制器

secondController.option1 = "look kids, Parliament, Big Ben"
secondController.option2 = "Don't call me Shirley"

如果您使用的是UINavigator控制器。你可以试试这个解决方案

chatVc.receiverData = sender as! String
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedConversation = conversationArray[indexPath.row]
    showConversationMessages(conversation: selectedConversation)
}


func showConversationMessages(conversation: ConversationItem){
    let vc = storyboard?.instantiateViewController(withIdentifier: "MessagesViewController") as! MessagesVC
    vc.receiverId = conversation.idMessagePartner
    vc.receiverToken = conversation.receiverToken
    vc.receiverUserName = conversation.userDisplayName
    navigationController?.pushViewController(vc, animated: true)
}
ConversationItem
是我用来保存所需数据的类

然后,您可以使用第二个控制器中的变量,在我的示例中,我将其命名为
MessageVC

class MessagesVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextViewDelegate {
    private let TAG = "MessagesVC"

    var receiverId: Int64 = 0
    var receiverToken: String = ""
    var receiverUserName: String = ""

  ....

我从来没有真正使用过
override func prepare(对于segue:NSStoryboardSegue,sender:Any?
),但我确实看到很多人在这方面有问题。

知道具体是哪一行导致了错误会有帮助。设置一个断点并手动逐行遍历将显示出错误所在的行。但是,我怀疑这一行chatVc.receiverData=sender是将sender指定为值的任意对象,这与这一行let receiverId=receiverData as不匹配!String@Jay导致错误的行是
let receiverId=receiverData as!字符串
右侧。根据我的评论。无法将发件人分配给字符串,因为它是另一个类。(覆盖公共函数prepare(对于segue:UIStoryboardSegue,发送方:Any?){(@Jay为我分配发件人的正确方式是什么?我发布了一个答案,可以提供另一个选择,但任何都应该是字符串,所以chatVc.receiverData=sender as!字符串的方向是正确的。如果你能向我解释为什么这样做,
@IBAction func sendMessage(sender:Any){performsgue(带有标识符:“sendMessageToUser”,发件人:self.userpicuid)}
在另一个视图控制器中,具有与我的问题中完全相同的覆盖公共函数。不确定这是否是您要问的问题,但发件人:Any?与发件人:self.userpicuid是一个显著的区别。Any是Any对象(目前未定义)而uidpicid是一个字符串。因此,本质上我想传递字符串self.userpicuid,所以我将chatvc.receiverdata更改为
chatvc.receiverdata=self.userpicuid
,并在chatviewcintroller中设置
var receiverdata:String?
让receiverId=receiverdata!
,但现在我收到了错误:意外发现我l在展开可选文件时value@juelizabeth我们将,这意味着其中一个不应该为nil的变量实际上是nil。您已将receiverData定义为可选字符串,因此它可以是可选的nil,如果是,则该错误将是有意义的。我建议添加一些print语句,以查看变量为nil的位置和时间。I虽然没有看到你的代码,但这是一个黑暗中的尝试。也许还有一个问题,为什么它是零呢?有没有办法让你看看我的代码,我已经为此奋斗了一个多星期了