2017-03-16 201 views
0

通过构建我的第一个应用程序绊倒我的路。试图从一个视图控制器(“ViewController”)传递一个变量到另一个(“SecondViewController)。我在Stack Overflow上找到了一些代码,但是出现了一个错误,我不知道我在做什么错误。有:共享变量

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:字符串

我正在一个错误,虽然第一视图控制器: “类型的值没有成员'(见图)

我为什么会这样呢。我会很感激任何建议。 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. 

      } 


      } 
+0

有时,当用户剪切和粘贴到堆栈溢出,代码格式被犯规。调整您的格式以符合您的实际代码,因为它看起来像是在这里发生的。 –

回答

0

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

尝试修改此:

var secondVC = segue!.SecondViewController as  ViewController; 

要这样:

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

谢谢,但我仍然得到同样的错误。 –

+0

看着另一个答案,两个想法:(1)请说明你正在使用什么版本的Swift。帮助你至关重要。 (2)请包含更多代码(您的代码在OP中确实不应该编译,因为'segue!.SecondViewController'不是合适的语法。问题真的是变量'toPass'没有在一个方式或其他方式。答案在于你没有发布的代码。 – dfd

+0

昨晚我一定很累。你的建议似乎在今天上午工作。对于那个很抱歉!我希望我可以给每个人好的答案,但我会接受你的。非常感谢! –

0

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

例雨燕2.3的代码(未测试):

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语法。

0

再看看你的代码。 var toPass: String!应该在任何功能之外,仍然在你的班级中。

@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! 
}