2016-09-07 107 views
0

我是Swift新手。我試圖在兩個視圖控制器之間傳遞數據。第二個視圖控制器使用的值,從第一個視圖控制器傳遞的值爲零。我不明白爲什麼會發生這種情況。視圖控制器之間的Swift傳輸數據保持空

這是我在第一個視圖控制器中的tableView函數調用。它獲取所選表格單元的用戶信息。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let user = User() 


    if(messages.count > 0) { 
     let message = self.messages[indexPath.row] 

     guard let chatPartnerID = message.chatPartnerID() else { 
      return 
     } 


     let ref = FIRDatabase.database().reference().child("users").child(chatPartnerID) 
     ref.observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

      guard let dictionary = snapshot.value as? [String: AnyObject] 
       else { 
        return 
      } 

      user.id = chatPartnerID 
      user.setValuesForKeysWithDictionary(dictionary) 
      self.setupChatLogControllerForUser(user) 

      }, withCancelBlock: nil) 
    }else { 
     let user = users[indexPath.row] 
     self.setupChatLogControllerForUser(user) 
    } 


} 

NSObjectUser我聲明,像這樣:

class User: NSObject { 

    var id: String? 
    var name: String? 
    var email: String? 
    var profileImageUrl: String? 
} 

在第一視圖中控制器setupChatLogControllerForUser(user)方法需要在被在tableView方法給出,傳遞到所述第二視圖的用戶參數控制器(ChatLogController)這樣的:

func setupChatLogControllerForUser(user: User) { 
    let chatLogController = ChatLogController() 
    chatLogController.selectedUserID = user.id! 
    chatLogController.user = user 
} 

我的第二個視圖控制器方法與此接收數據:

var selectedUserID = String() 
var user = User() 

第二視圖控制器還具有handleSend方法,該方法是通過IBAction連接到按鈕上我的故事板。

func handleSend() { 

    let ref = FIRDatabase.database().reference().child("messages") 
    let childRef = ref.childByAutoId() 
    let toID = self.selectedUserID 
    let fromID = FIRAuth.auth()!.currentUser!.uid 
    let timestamp: NSNumber = Int(NSDate().timeIntervalSince1970) 

    let values = ["text": messageInputField.text!, "toID": toID, "fromID": fromID, "timestamp": timestamp] 
    childRef.updateChildValues(values) { (error, ref) in 

     if error != nil { 
      print(error) 
      return 
     } 

     let userMessagesRef = FIRDatabase.database().reference().child("userMessages").child(fromID) 

     let messageID = childRef.key 
     userMessagesRef.updateChildValues([messageID: 1]) 

     let recipientUserMessagesRef = FIRDatabase.database().reference().child("userMessages").child(toID) 
     recipientUserMessagesRef.updateChildValues([messageID: 1]) 

    } 

} 

這種方法就是發生問題的地方。我設置toID等於selectedUserID。在調試器中,當視圖控制器延伸到ChatLogController時,我可以看到填充了字符串的selectedUserID。爲什麼在調用方法時selectedUserID的值爲零?

據我所知,通過在selectedUserIDUser對象是多餘的,我只是想看看,如果問題是一些與字符串變量爲類間傳遞,但它保持爲零。

任何幫助將會很棒!

編輯: 我使用的是賽格瑞

+0

如何從第一個vc移動到第二個vc?繼續或編程? – Tj3n

+0

你應該執行segue而不是新的ChatLogController() – WeiJay

+0

問題是'ChatLogController()'。這是一個新的空實例,而不是故事板中預期的控制器。 – vadian

回答

0

你並不需要實例ChatLogController傳遞數據,因爲如果你設置了NavigationController妥善我視圖控制器之間進行切換,然後他將爲你實例化。

func setupChatLogControllerForUser(user: User) { 
    let chatLogController = ChatLogController() 
    chatLogController.selectedUserID = user.id! 
    chatLogController.user = user 
} 

所以,如果你想將數據傳遞到ChatLogController,你應該爲此目的而使用prepareForSegue方法。


我將提供一個基本的例子,你如何能夠模仿這種類型的功能:

這是結果

enter image description here


這是我的故事板:

請注意,segue的名稱是showDetail,如圖所示。

enter image description here


這是我TableViewController的代碼:

當我觸及TableViewController細胞中,didSelectRowAtIndexPath方法方法被調用,然後我進入細胞選中並設置值爲dataToSend變量,最後我打電話performSe gueWithIdentifier爲了導航到ViewController

但正當它去的ViewControllerprepareForSegue方法被稱爲讓你有機會在這裏傳遞的ViewController預計任何變量,在這種情況下,我路過dataToSend的ViewController的dataSent變量。

class TableViewController: UITableViewController { 

    var dataToSend = "" 

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

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = tableView.cellForRowAtIndexPath(indexPath) 

    dataToSend = cell!.textLabel!.text! 

    performSegueWithIdentifier("showDetail", sender: nil) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let viewController = segue.destinationViewController as? ViewController { 
     viewController.dataSent = dataToSend 
     } 
    } 
    } 

} 

這對於視圖控制器代碼:

的話,我可以顯示在標籤中的值。

class ViewController: UIViewController { 
    @IBOutlet weak var label: UILabel! 

    var dataSent = String() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    label.text = dataSent 
    } 

} 
+0

非常感謝你的清晰解釋,它的工作! –

相關問題