2017-05-31 5 views
0

は、私は彼/彼女の選択の任意のユーザに持っていたメッセージログインしているユーザーのリストを持っているtableViewControllerを持って働いていないチャット。セルをクリックすると、ログインしたユーザーが任意のユーザーとチャットできるView Controllerに移動する必要があります。私はエラーが「Lit_Swap.MessageTableViewCell」(型の値をキャストすることができませんでした取得firebase IOSはアプリが

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 
     }} 

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 

} 

そして、先のビューコントローラで

、これはセットアップがある:私はオーバーライドセグエを設定しています0x1091d0f10)から 'NSString'(0x10b153c60)に変更します。送信者は明らかにtableviewcellなので、送信者を設定してセルをクリックしてチャットコントローラに送ることができます。

+0

エラーの原因となっている行を具体的に知ることができます。ブレークポイントを設定し、手動で行単位でステップ実行すると、エラーのある行が表示されます。しかし、私はこの行* chatVc.receiverData =送信者が本当にこの行と一致しない値として送信者を割り当てるAnyObject *と考えています* let receiverId = receiverData as!文字列* – Jay

+0

@Jay原因はエラーです 'let receiverId = receiverData as! String' – juelizabeth

+0

右。私のコメントごとに。あなたは* sender *を別のクラスのように文字列に割り当てることはできません。 *(公共funcはセグエのために(準備上書き:UIStoryboardSegue、送信者を?:任意){(* – Jay

答えて

0

は、ビュー間でデータを移動する方法はたくさんありますが、一つはセグエあり、同様segue'ingするためのオプションがいくつかあります。ここで

1は

は、我々は、TextFieldと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のアクションをトリガーボタンでビューコントローラを持っていると言うrepresentedObjectプロパティを使用しています
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プロパティを使用したくないという疑問に答えるために、a Stringへの代入は解決策になります。第三の選択肢として

chatVc.receiverData = sender as! String 

もしUINavigatorcontrollを使用している場合、SecondController内の任意のクラスVARS直接最初のビューコントローラ

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

あなたが私に説明することができれば、なぜこの@IBAction func sendMessage(_送信者:Any){ performSegue(withIdentifier: "sendMessageToUser"、送信者:self.userpicuid) } '私の質問の正確に同じオーバーライド公開関数が機能します。 – juelizabeth

+0

これがあなたが求めているものかどうかは分かりませんが、* sender:Any?* vs * sender:self.userpicuid *は大きな違いです。 * Any *は任意のオブジェクト(現時点では未定義)ですが、* uidpicid *は文字列です。 – Jay

+0

私はchatVc.receiverdataを 'chatVc.receiverData = self.userpicuid'に変更し、chatviewcintrollerで' var receiverData:String? 'と' let receiverId = receiverData! 'を設定しましたが、文字列self.userpicuidを渡したいのですが今私はエラーが表示されます:オプション値をアンラッピングしている間に予期せずnilが見つかりました – juelizabeth

0

から次いで

class SecondController: NSViewController { 
    var option1 = "" 
    var option2 = "" 

を設定することができます。この解決策を試すことができます。

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?)で働いたことがありませんが、私はそれで問題が発生して多くの人々を参照しています。

関連する問題