共享variables

通过构build我的第一个应用程序绊倒我的方式。 试图从一个视图控制器(“视图控制器”)传递到另一个(“SecondViewController)的variables。我发现了堆栈溢出的一些代码,但得到一个错误,我不知道我在做什么错误。在第一个视图控制器I有:

func prepareForSegue(segue: UIStoryboardSegue!, sender: Any!) { if (segue.identifier == "segueTest") { //Checking identifier is crucial as there might be multiple // segues attached to same view var secondVC = segue!.SecondViewController as ViewController; secondVC.toPass = "email" } } 

在第二个视图控制器中我有:

var toPass:String!

我在第一个视图控制器中出现错误:'types的值没有成员'(见图)

我为什么会这样呢? 我将不胜感激任何build议。 2

(Swift 3?)我发布了下面两个视图控制器的所有代码,看看是否可以帮助。 我为代码的混乱道歉。 这是第一个视图控制器代码:

 import UIKit import FBSDKLoginKit extension UserDefaults { // check for is first launch - only true on first invocation after app install and sends user to answer questions static func isFirstLaunch() -> Bool { let hasBeenLaunchedBeforeFlag = "hasBeenLaunchedBeforeFlag" let isFirstLaunch = !UserDefaults.standard.bool(forKey: hasBeenLaunchedBeforeFlag) if (isFirstLaunch) { UserDefaults.standard.set(true, forKey: hasBeenLaunchedBeforeFlag) UserDefaults.standard.synchronize() } print(hasBeenLaunchedBeforeFlag) return isFirstLaunch } } class ViewController: UIViewController, FBSDKLoginButtonDelegate { override func viewDidLoad() { super.viewDidLoad() let loginButton = FBSDKLoginButton() view.addSubview(loginButton) loginButton.frame = CGRect(x: 16, y: 350, width: view.frame.width - 32, height: 50) loginButton.delegate = self self.view.backgroundColor = UIColor(patternImage: UIImage(named:"Book Funnel")!) } func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { print("Did log out of Facebook") } //Gather Facebook demographic information func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { if error != nil { print(error) return } let login: FBSDKLoginManager = FBSDKLoginManager() // Make login and request permissions login.logIn(withReadPermissions: ["email", "public_profile"], from: self, handler: {(result, error) -> Void in if error != nil { // Handle Error NSLog("Process error") } else if (result?.isCancelled)! { // If process is cancel NSLog("Cancelled") } else { // Parameters for Graph Request let parameters = ["fields": "email, name"] FBSDKGraphRequest(graphPath: "me", parameters: parameters).start {(connetion, result, error) -> Void in if error != nil { NSLog(error.debugDescription) return } // Result print("Result: \(result)") // Handle vars if let result = result as? [String:String], let email: String = result["email"], let fbId: String = result["id"] { print("Email: \(email)") print("fbID: \(fbId)") func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { if segue!.identifier == "segueTest" { if let secondVC = segue!.SecondViewController as? ViewController { secondVC.toPass = "email" } } } } } } }) func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } } 

第二个视图控制器代码:

 import UIKit import FBSDKCoreKit import FBSDKLoginKit class SecondViewController: UIViewController { @IBOutlet weak var sliderLabel: UILabel! @IBOutlet weak var verticalSlider: UISlider! { didSet{ verticalSlider.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_2)) } } //Change label as slider moves @IBAction func verticalSliderChanged(_ sender: UISlider) { var currentValue = Double(sender.value); sliderLabel.text = "\(currentValue)" } @IBOutlet weak var ratingSubmitted: UIButton! @IBAction func checkmarkPressed(_ sender: Any) { func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor(patternImage: UIImage(named:"Book Funnel")!) } } @IBOutlet weak var checkmarkButton: UIButton! @IBAction func checkmarkButtonPressed(_ sender: Any) { let img:UIImageView = UIImageView(frame: CGRect(x: 30, y: 180, width: 250, height: 320)) let randomImage = arc4random() if (randomImage % 3 == 0) { img.image = UIImage(named: "hero.jpg") } else if (randomImage % 3 == 1) { img.image = UIImage(named: "hillary.jpg") } else { img.image = UIImage(named: "thistimeisdifferent.jpg") } // img.contentMode = UIViewContentMode.ScaleAspectFill // img.backgroundColor = UIColor.redColor() self.view.addSubview(img) var toPass: String! } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

你的第二个视图控制器是错误的,所以它不知道variablestoPass

尝试改变这一点:

 var secondVC = segue!.SecondViewController as ViewController; 

对此:

 if let secondVC = segue.destination as? SecondViewController { secondVC.toPass = "email" } 

错误消息告诉你到底是什么错误: UIStoryboardSegue没有一个名为SecondViewController的属性。 你想使用属性destinationViewController

示例Swift 2.3代码(未testing):

 override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { if segue!.identifier == "segueTest" { if let secondVC = segue!.destinationViewController as? ViewController { secondVC.toPass = "email" } } } 

如果您的目标视图控制器实际上被命名为SecondViewController那么第三行应该是:

 if let secondVC = segue!.destinationViewController as? SecondViewController { 

顺便说一句,你可能要考虑转向Swift 3语法。

再看看你的代码。 var toPass: String! 应该在任何function之外,仍然在你的class级之内。

 @IBAction func checkmarkButtonPressed(_ sender: Any) { let img:UIImageView = UIImageView(frame: CGRect(x: 30, y: 180, width: 250, height: 320)) let randomImage = arc4random() if (randomImage % 3 == 0) { img.image = UIImage(named: "hero.jpg") } else if (randomImage % 3 == 1) { img.image = UIImage(named: "hillary.jpg") } else { img.image = UIImage(named: "thistimeisdifferent.jpg") } // img.contentMode = UIViewContentMode.ScaleAspectFill // img.backgroundColor = UIColor.redColor() self.view.addSubview(img) var toPass: String! } 

将其更改为:

 class SecondViewController: UIViewController { @IBAction func checkmarkButtonPressed(_ sender: Any) { // IBAction function stuff } var toPass: String! }