2016-09-07 77 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

非常感谢你的清晰解释,它的工作! –

相关问题