Xcode(Swift):我无法在视图控制器之间传输数据

Posted

技术标签:

【中文标题】Xcode(Swift):我无法在视图控制器之间传输数据【英文标题】:Xcode(Swift): I can't transfer data between View Controllers 【发布时间】:2017-11-28 00:09:37 【问题描述】:

所以我正在创建一个应用程序,该应用程序需要密码才能初始登录,然后将您带到主应用程序,您可以在其中访问不同的程序。我设置密码视图控制器的方式是它具有层,并且在 swift 文件中,我有一个变量('x'),它会根据某些情况发生变化。当 x 值改变时,视图上的内容也会改变。例如,当 x = '1.0' 时,第一层处于活动状态,这意味着尚未输入密码。输入时,x = '1.5' 会弹出一个屏幕,告诉您密码正确,并出现一个按钮,引导您进入主页。在主页上,我有一个按钮它将您连接回允许您更改密码的第一页。我希望主页更改 x 值,以便在您打开密码页面时有一个全新的页面。我的问题是我无法让 segue 工作。这是我的 2 个视图控制器的示例代码:

    import UIKit

class ViewController: UIViewController 

var x = "1.0"
//First Page--------------------------------
@IBOutlet weak var Textbar: UITextField!
@IBOutlet weak var submitbutton: UIButton!
@IBOutlet weak var enterYourPasscode: UILabel!
@IBOutlet weak var Welcome: UILabel!


//1.5-------------------------------
@IBOutlet weak var correct: UILabel!
@IBOutlet weak var Open: UIButton!

@IBAction func CloseKeyboard(_ sender: AnyObject) 
    self.resignFirstResponder()

var password="Ree"


@IBAction func SubmitClick(_ sender: Any) 
    if Textbar.text == password 
        x = "1.5"
        checkVersion()

    else
        enterYourPasscode.text="Wrong, try again."
    


func checkVersion ()

    if x == "1"
        correct.isHidden = true
        Open.isHidden = true

        Textbar.isHidden = false
        submitbutton.isHidden = false
        enterYourPasscode.isHidden = false
        Welcome.isHidden = false
    
    if x == "1.5"
        correct.isHidden = false
        Open.isHidden = false

        Textbar.isHidden = true
        submitbutton.isHidden = true
        enterYourPasscode.isHidden = true
        Welcome.isHidden = true
    


override func viewDidLoad() 

    checkVersion()

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.




这是我要发送数据的视图的代码:

    import UIKit

class ViewController2: UIViewController 

@IBOutlet weak var Settings: UIButton!

@IBAction func GoToSettings(_ sender: Any) 








override func viewDidLoad() 
    super.viewDidLoad()

    // Do any additional setup after loading the view.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    var recievingController = segue.destination as! ViewController
    ViewController.x = "2.0"




错误显示在第二个视图控制器上,它显示“viewController.x = '2.0'”,错误显示“实例成员 'x' 不能用于类型 'ViewController'” 我花了很多时间试图弄清楚为什么会这样做,因为我过去做过类似的事情而没有问题。虽然有一个简单的解决方案,但我可能只是想多了,这就是我向社区询问的原因。编辑:我的问题已经解决,感谢所有提供帮助的人!

【问题讨论】:

【参考方案1】:

当您将目的地向下转换为 ViewController 时,您将其存储在接收控制器变量中。很简单:只引用那个变量:

receivingController.x = "2.0"

错误消失了。顺便说一句,你拼错了“接收”:)

【讨论】:

没问题。接受答案(点击复选标记)并确保投票:) 我没有 15 声望。我做了,但它不会公开显示。【参考方案2】:

您需要在第二个视图中使用 recievingController.x 而不是 ViewController.x,因为那是 viewController 的实例

【讨论】:

【参考方案3】:

您的代码有问题。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    var recievingController = segue.destination as! ViewController
    ViewController.x = "2.0"

试试这个:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    var recievingController = segue.destination as! ViewController
    recievingController.x = "2.0"

【讨论】:

【参考方案4】:

简而言之,问题的直接原因是:

var x = "1.0"

应该是

public var x = "1.0"

无论风格如何,最好将此属性封装在一个名为 LoginManager 的类中,并使用一个可以在发生变化时更新的委托。

【讨论】:

以上是关于Xcode(Swift):我无法在视图控制器之间传输数据的主要内容,如果未能解决你的问题,请参考以下文章

Xcode Swift - 在视图控制器之间传递按钮路径数据

在 Xcode 6 和 Swift 中的视图之间进行类似 Snapchat 的滑动导航)

Xcode6/Swift - 如何在多个视图控制器中实现 iAdBannerView?

Xcode & Swift - 无法从 AppDelegate 实例化另一个视图控制器

如何在视图控制器之间传输 Xcode 8 上的绘图?

如何在情节提要 XCode6 (Swift) 中将所有视图控制器设置为风景