Xcode(Swift): 我无法在视图控制器之间传输数据
Xcode(Swift): I can't transfer data between View Controllers
所以我正在创建一个应用程序,这个应用程序需要密码才能初始登录,然后它将带您到主应用程序,您可以在其中转到不同的程序。我设置密码视图控制器的方式是它有层,在 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' "
我花了很多时间试图弄清楚为什么要这样做,因为我过去做过类似的事情而没有问题。虽然有一个简单的解决方案,但我可能只是想得太多了,这就是为什么我要问社区。
编辑: 我的问题已经解决了,感谢所有提供帮助的人!
当您向下转换目标为 ViewController 时,您将其存储在 receivingController 变量中。简单:只需引用该变量:
receivingController.x = "2.0"
错误消失了。顺便说一句,你拼错了 'receiving' :)
简而言之,问题的直接原因是:
var x = "1.0"
应该是
public var x = "1.0"
然而,从风格上讲,最好将此 属性 包装在一个名为 LoginManager 的 class 中,并使用一个可以在发生变化时进行更新的委托。
您需要在第二个视图中选择 recievingController.x
而不是 ViewController.x
,因为那是 viewController
的实例
你的代码有问题。
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"
}
所以我正在创建一个应用程序,这个应用程序需要密码才能初始登录,然后它将带您到主应用程序,您可以在其中转到不同的程序。我设置密码视图控制器的方式是它有层,在 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' "
我花了很多时间试图弄清楚为什么要这样做,因为我过去做过类似的事情而没有问题。虽然有一个简单的解决方案,但我可能只是想得太多了,这就是为什么我要问社区。
编辑: 我的问题已经解决了,感谢所有提供帮助的人!
当您向下转换目标为 ViewController 时,您将其存储在 receivingController 变量中。简单:只需引用该变量:
receivingController.x = "2.0"
错误消失了。顺便说一句,你拼错了 'receiving' :)
简而言之,问题的直接原因是:
var x = "1.0"
应该是
public var x = "1.0"
然而,从风格上讲,最好将此 属性 包装在一个名为 LoginManager 的 class 中,并使用一个可以在发生变化时进行更新的委托。
您需要在第二个视图中选择 recievingController.x
而不是 ViewController.x
,因为那是 viewController
你的代码有问题。
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"
}