firebase ios聊天应用程序不工作
我有一个tableViewController,其中包含登录用户与他/她选择的任何用户之间的消息列表。单击该单元格时,它应转到允许登录用户与任何用户聊天的视图控制器。我已经设置了一个覆盖序列: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
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虽然没有看到你的代码,但这是一个黑暗中的尝试。也许还有一个问题,为什么它是零呢?有没有办法让你看看我的代码,我已经为此奋斗了一个多星期了