视图控制器之间的Swift传输数据保持空
我是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)
}
}
在NSObject
User
我声明,像这样:
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
的值为零?
据我所知,通过在selectedUserID
和User
对象是多余的,我只是想看看,如果问题是一些与字符串变量为类间传递,但它保持为零。
任何帮助将会很棒!
编辑: 我使用的是赛格瑞
你并不需要实例ChatLogController传递数据,因为如果你设置了NavigationController妥善我视图控制器之间进行切换,然后他将为你实例化。
func setupChatLogControllerForUser(user: User) {
let chatLogController = ChatLogController()
chatLogController.selectedUserID = user.id!
chatLogController.user = user
}
所以,如果你想将数据传递到ChatLogController,你应该为此目的而使用prepareForSegue方法。
我将提供一个基本的例子,你如何能够模仿这种类型的功能:
这是结果:
这是我的故事板:
请注意,segue的名称是showDetail,如图所示。
这是我TableViewController的代码:
当我触及TableViewController细胞中,didSelectRowAtIndexPath方法方法被调用,然后我进入细胞选中并设置值为dataToSend变量,最后我打电话performSe gueWithIdentifier为了导航到ViewController。
但正当它去的ViewController,prepareForSegue方法被称为让你有机会在这里传递的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
}
}
非常感谢你的清晰解释,它的工作! –
如何从第一个vc移动到第二个vc?继续或编程? – Tj3n
你应该执行segue而不是新的ChatLogController() – WeiJay
问题是'ChatLogController()'。这是一个新的空实例,而不是故事板中预期的控制器。 – vadian