所以我有3个控制器,比方说ChatVC
,MenuVC
和InviteVC
。
从ChatVC
开始,我打开菜单,点按一个按钮,将菜单关闭回ChatVC
,然后转到InviteVC
。
ChatVC
和MenuVC
都有我需要传递给InviteVC
(currentRoomID
)的值。然而,这似乎是将问题转移到InviteVC
的问题。 currentRoomID
在InviteVC上初始化为空字符串。
这是当我点按菜单中的按钮转到InviteVC
时执行的操作:
@IBAction func invitePressed(_ sender: Any) {
weak var pvc = self.presentingViewController
self.dismiss(animated: true) {
pvc?.performSegue(withIdentifier: "chatInvite", sender: nil)
}
}
我尝试在解雇闭包中以及viewDidLoad
和MenuVC
的{{1}}中添加此内容:
ChatVC
我尝试在let inviteVC = InviteVipViewController()
inviteVC.currentRoomId = self.currentRoomID
的prepareForSegue:
ChatVC
当我到达override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? MenuViewController {
destinationViewController.transitioningDelegate = self
destinationViewController.interactor = interactor
destinationViewController.currentRoomID = self.currentRoomID
} else if segue.identifier == "chatInvite" {
let inviteVC = InviteVipViewController()
inviteVC.currentRoomID = self.currentRoomID
}
}
时,currentUserID
每次都是空字符串。当我从InviteVC
直接InviteVC
时,它似乎没有问题,但是因为我将其更改为当前转换(菜单后退回MenuVC
,然后segues到ChatVC
),似乎无法通过这个价值。
这令人非常沮丧,所以如果有人能帮助我尝试一些我没有尝试过的东西,我将非常感激!
答案 0 :(得分:1)
你在prepareForSegue中遇到问题
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? MenuViewController {
destinationViewController.transitioningDelegate = self
destinationViewController.interactor = interactor
destinationViewController.currentRoomID = self.currentRoomID
// if identifier equals to chatInvite then you get your InviteViewController from segues Destination not by creating one
} else if segue.identifier == "chatInvite" {
let inviteVC = segue.destination as? InviteVipViewController
inviteVC.currentRoomID = self.currentRoomID
}
}
注意:我可以看到您试图从已经解散的ViewController中删除。所以我认为你必须将这个逻辑移到你的MainViewController,我认为它是 MenuViewController
你也不应该像这样实例化你的InviteVIPViewController
let inviteVC = InviteVipViewController()
inviteVC.currentRoomId = self.currentRoomID
segue会为你做这件事
您可以使用UserDefaults传递currentRoomID,例如
@IBAction func invitePressed(_ sender: Any) {
let userDefaults = UserDefaults.standard
userDefaults.set(currentRoomID, forKey: "roomID")
// call the synchronise so it sync force the user defaults to save
userDefaults.synchronize()
weak var pvc = self.presentingViewController
self.dismiss(animated: true) {
pvc?.performSegue(withIdentifier: "chatInvite", sender: nil)
}
}
现在访问inviteViewController viewDidLoad()中的currentRoomID 我还假设roomID为int
let userDefaults = UserDefaults.standard
currentRoomID = userDefaults.integer(forKey: "roomID")
// if string then you can use object and cast it to string like this
currentRoomID = userDefaults.object(forKey: "roomID") as! String
答案 1 :(得分:0)
这一行:
let inviteVC = InviteVipViewController()
创建一个全新的InviteVipViewController实例,与您将要实现的实例完全无关。您应该使用segue.destination
(这是您即将要进行的实例)。唯一的附带条件是您应该测试以确认目的地的类型是否正确(就像您对MenuViewController
的segue所做的那样):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? MenuViewController {
destinationViewController.transitioningDelegate = self
destinationViewController.interactor = interactor
destinationViewController.currentRoomID = self.currentRoomID
} else if segue.identifier == "chatInvite" {
if let inviteVC = segue.destination as? InviteVipViewController {
inviteVC.currentRoomID = self.currentRoomID
}
}
}
答案 2 :(得分:-1)
我曾经使用segues,发现它们不必要地复杂化。这是一个解决方法......
在您导入UIKit的代码部分(在顶部),为您要传递的任何内容添加变量,在这种情况下,假设我想传递分数。
//view controller one
import UIKit
var score = 25
然后进入视图控制器,在那里你想要接收 - 在这个案例得分中,你可以轻松地访问它,就像它是你自己的视图控制器中的变量一样。
//Viewcontrollertwo
super.viewDidLoad()
score += 2
//score is now = 27, requires no segue