2017-03-16 199 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! 
}