Ios Can';似乎无法将某个值传递给另一个控制器
所以我有3个控制器,比如说Ios Can';似乎无法将某个值传递给另一个控制器,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,所以我有3个控制器,比如说ChatVC,MenuVC,和InviteVC 从ChatVC开始,我打开菜单并点击一个按钮,该按钮将菜单取消回到ChatVC,然后转到InviteVC ChatVC和MenuVC都有我需要传递给InviteVC(currentRoomID)的值。然而,将其发送到InviteVC似乎是一个相当大的问题currentRoomID在InviteVC上初始化为空字符串 这是当我点击菜单中的按钮将我带到InviteVC时执行的操作: @IBAction func inviteP
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)
}
}
let inviteVC = InviteVipViewController()
inviteVC.currentRoomId = self.currentRoomID
我试着在discome闭包中添加这个,以及在MenuVC
和ChatVC
的viewDidLoad
中添加这个:
@IBAction func invitePressed(_ sender: Any) {
weak var pvc = self.presentingViewController
self.dismiss(animated: true) {
pvc?.performSegue(withIdentifier: "chatInvite", sender: nil)
}
}
let inviteVC = InviteVipViewController()
inviteVC.currentRoomId = self.currentRoomID
我已尝试将其传入ChatVC
s prepareforsgue:
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
}
}
每次当我进入InviteVC
时,currentUserID
都是一个空字符串。当我直接从MenuVC
切换到InviteVC
时,这似乎不是一个问题,但由于我将其更改为当前的转换(菜单会返回到ChatVC
,然后切换到InviteVC
),因此似乎无法传递该值
这是令人难以置信的沮丧,所以如果有人能帮我尝试一些我以前从未尝试过的东西,我将不胜感激 这一行:
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
// 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
塞格会帮你的
您可以使用UserDefaults和
@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
我曾经使用segues,发现它们不必要地复杂。这里有一个解决办法 在您导入UIKit的代码部分(顶部),为您想要通过的任何内容添加一个变量,在本例中,假设我想要通过评分
//view controller one
import UIKit
var score = 25
然后进入视图控制器,您希望在这里接收分数,您可以轻松地访问它,就像它是您自己的视图控制器中的变量一样
//Viewcontrollertwo
super.viewDidLoad()
score += 2
//score is now = 27, requires no segue
为什么你处理这两个可能的阶段如此不同?你是什么意思?从菜单->邀请的顺序是这样做的(关闭菜单,然后从聊天->邀请),原因是当我在邀请VC上按“完成”并关闭它时,它会直接返回聊天-而不是返回滑出菜单,然后必须滑回菜单以返回聊天,我指的是您的准备方法。首先,如果您检查目标控制器的类型,然后使用目标控制器。第二次检查segue id,然后创建一个新实例。这是两种完全不同的检查类型和访问/创建目标视图控制器的两种完全不同的方式。我没有意识到
让inviteVC=InviteVipViewController()
正在创建一个新的视图控制器,我认为这基本上与destinationViewController=segue.destination as是一样的?菜单查看控制器
。但是进行了修复,currentRoomID
仍然无法正确通过-它在Invite VC中仍然是一个空字符串。尝试了这个,currentRoomID
在InviteVC
中仍然是一个空字符串,如果你读了我的便条,你试图从一个完全错误的viewController触发segue,这就是为什么你不能发送任何东西。尝试修复我不知道任何其他方法来处理这个序列以获得我想要的-我需要点击菜单中的按钮,让菜单自动关闭并返回聊天控制器,然后转到invite控制器。是的,如果您查看代码,您将取消菜单,并在完成调用performsgue时执行类似操作,这意味着关闭当前的ViewControllerself。取消(动画:true){pvc?.performsgue(标识符:“chatInvite”,发送者:nil)}
。segues现在的工作方式非常完美-我打开滑出菜单,点击“邀请”,然后菜单关闭回到聊天,出现InviteVC
。最后,当我在邀请VC上按“完成”时,它会自动退出聊天。但是当我们去邀请时,房间ID并没有通过。我认为这和另一个答案是一样的,我修正了它并尝试了解决方案,但currentRoomID在InviteVC中仍然是一个空字符串。如果我可以保持这些段工作不变,我会做不同的事情,但如果我只是从菜单中选择邀请VC,那么当我点击“完成”时在该控制器上调用Disclose,它将返回菜单-当按下“完成”时,我需要返回聊天室不确定为什么会降级,因为它可以工作,我现在使用它而不是segues。。。