将一个变量从一个视图控制器传递到另一个视图控制器

Posted

技术标签:

【中文标题】将一个变量从一个视图控制器传递到另一个视图控制器【英文标题】:Pass one variable from one viewcontroller to another viewcontroller 【发布时间】:2015-02-08 04:21:06 【问题描述】:

我是 swift 语言的新手,知道这个问题是重复的。我发现了几个类似的问题和答案,但我无法找出问题所在。

我想将 detectionString 变量的值从 ScanViewController 传递给 ResultViewController。

ScanViewcontroller 如下:

import UIkit

class ScanViewController: UIViewController  

    var detectionString : String!

    override func viewDidLoad() 
        super.viewDidLoad()

        detectionString = “SomeDetectedString”
    

    override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject!) 
        if (segue.identifier == "MySegue") 
            var svc = segue.destinationViewController as ResultViewController;
            svc.detectedString = detectionString
        
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

ResultViewController 如下:

import UIkit

class ResultViewController: UIViewController 

    var detectedString: String!

    override func viewDidLoad() 
        super.viewDidLoad()
        self.view.backgroundColor=UIColor.whiteColor()
        println(detectedString)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

println(detectedString) 没有给我任何结果。问题是如何从 ScanViewController 中获取变量?

【问题讨论】:

Pass variables from one ViewController to another in Swift的可能重复 【参考方案1】:

这可能听起来很奇怪,但您的代码没有任何问题,但它不能按原样工作。我同样使用了你的代码,它忽略了segue。然后我将ScanViewController 嵌入故事板的导航控制器中。我还在ScanViewController viewDidLoad 中拨打了self.performSegueWithIdentifier("MySegue", sender: self) 的电话以启动segue。然后一切都像魅力一样。您的 prepareForSegue 很好。 Yuvrajsinh 的建议很好但不是必需的(我在将 DetailVC 更改为 ResultViewController 后尝试过)。没有导航控制器,什么都不起作用。 segue.identifier 是一个字符串,它可以直接进行 Swift 字符串比较。

下面是 ScanViewController 的代码:

import UIkit

class ScanViewController: UIViewController  

    var detectionString : String!

    override func viewDidLoad() 
        super.viewDidLoad()


        detectionString = "SomeDetectedString"
        println(detectionString)
        self.performSegueWithIdentifier("MySegue", sender: self)
    

    override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject!) 

        if (segue.identifier == "MySegue" || segue.identifier == "SegueFromButton") 
            println("prepareForSegue")
            var svc = segue.destinationViewController as ResultViewController;
            svc.detectedString = detectionString
            println("svc.detectedString: \(svc.detectedString)")
        
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    



对于 ResultViewController:

import UIkit

class ResultViewController: UIViewController 

    var detectedString: String!

    override func viewDidLoad() 
        println("Result Load View")
        super.viewDidLoad()
        self.view.backgroundColor=UIColor.whiteColor()
        println("detectedString in Result: \(detectedString)")
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

【讨论】:

,感谢您的回答,非常感谢您的帮助,它按照您的描述工作。除此之外,我还尝试使用 appdelegate 获取变量的访问值。再次感谢您。【参考方案2】:

您的 segue.identifier == "MySegue" 有点不符合应有的比较方式。

用下面的函数替换你的代码,你就完成了。

override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject!) 
    let segueName: String = segue.identifier!;
    if (segueName == "MySegue") 
        var svc = segue.destinationViewController as DetailVC;
        svc.detectedString = detectionString
    

【讨论】:

感谢您的回答,如果我通过@BIAction 触发segue,我可以从第一个值中获取值。 @IBAction func showsecond(sender: AnyObject) self.performSegueWithIdentifier("MySegue", sender: nil) 每当我尝试以编程方式触发 segue 时,它​​就会崩溃。【参考方案3】:

为您提供三个选项:

    使用prepareForSegue方法获取目标ViewController并设置属性 设置两个 ViewController 之间的委托关系进行通信 使用 NSNotificationCenter 设置观察者

【讨论】:

谢谢,我尝试了委托,它也适用于我。

以上是关于将一个变量从一个视图控制器传递到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 didSelectRowAtIndexPath 传递到另一个视图控制器 ios7

将从 HTTP 请求数据声明的数据/变量传递到另一个视图控制器

将变量传递给下一个视图控制器

将数据从视图控制器传递到另一个视图控制器

将 ImageData 从一个视图控制器传递到另一个视图控制器

快速将图像从一个视图控制器传递到另一个视图控制器