Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Can';似乎无法将某个值传递给另一个控制器_Ios_Swift_Uiviewcontroller - Fatal编程技术网

Ios Can';似乎无法将某个值传递给另一个控制器

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

所以我有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)
    }
}
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时执行类似操作,这意味着关闭当前的ViewController
self。取消(动画:true){pvc?.performsgue(标识符:“chatInvite”,发送者:nil)}
。segues现在的工作方式非常完美-我打开滑出菜单,点击“邀请”,然后菜单关闭回到聊天,出现
InviteVC
。最后,当我在邀请VC上按“完成”时,它会自动退出聊天。但是当我们去邀请时,房间ID并没有通过。我认为这和另一个答案是一样的,我修正了它并尝试了解决方案,但currentRoomID在InviteVC中仍然是一个空字符串。如果我可以保持这些段工作不变,我会做不同的事情,但如果我只是从菜单中选择邀请VC,那么当我点击“完成”时在该控制器上调用Disclose,它将返回菜单-当按下“完成”时,我需要返回聊天室不确定为什么会降级,因为它可以工作,我现在使用它而不是segues。。。