火力IOS聊天应用程序无法正常工作
我有了消息登录的用户的列表已经与他/她选择的任何用户有一个tableViewController。单击单元格时,它应该转到一个视图控制器,允许登录用户与任何用户聊天。我已经建立了一个覆盖赛格瑞:火力IOS聊天应用程序无法正常工作
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'ing以及选项。
下面是一个使用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
}
}
而且我们segue'ing到
的的viewController的动作的按钮视图控制器一个class SecondController: NSViewController {
@IBOutlet weak var targetTextField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear() {
self.targetTextField.text = self.representedObject as! String
}
}
另外,为了解决发送者是否是String的问题,我们不想使用representObject属性,分配给字符串将是一个解决方案。
chatVc.receiverData = sender as! String
作为第三个选择,任何类在SecondController瓦尔可能是如果使用一个UINavigatorcontroll直接设置
class SecondController: NSViewController {
var option1 = ""
var option2 = ""
然后从第一视图控制器
secondController.option1 = "look kids, Parliament, Big Ben"
secondController.option2 = "Don't call me Shirley"
可以请你,如果你可以向我解释为什么这样做@IBAction func sendMessage(_ sender:Any){在其他视图控制器中执行在我的问题完全相同的重写公共职能工程。 – juelizabeth
不确定这是你问的,但*发件人:任何?* vs *发件人:self.userpicuid *是一个重大的区别。 *任何*是任何对象(目前未定义),而* uidpicid *是一个字符串。 – Jay
所以基本上我想传递字符串self.userpicuid所以我改变chatvc.receiverdata到'chatVc.receiverData = self.userpicuid',并在chatviewcintroller我设置'var receiverData:String?'和'让receiverId = receiverData!'但现在我收到错误:意外地发现零,同时展开一个可选值 – juelizabeth
。你可以试试这个解决方案。
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(for segue: NSStoryboardSegue, sender: Any?)
合作过,但我确实看到很多有问题的人。
这将有助于具体了解哪条线路导致错误。设置一个断点并手动逐行逐行显示包含错误的行。但是,我怀疑这行* chatVc.receiverData =发件人为AnyObject *,它将发件人分配为一个值,与此行不匹配* let receiverId = receiverData as! String * – Jay
@Jay线路导致错误是'let receiverId = receiverData as!字符串' – juelizabeth
没错。根据我的评论。您不能将* sender *分配给字符串,因为它是不同的类。 *(覆盖公共FUNC准备(对于SEGUE:UIStoryboardSegue,发件人:任意){(* – Jay