2017-03-16 32 views
0

私の最初のアプリを構築する途中で困っています。 ( "ViewController")から別の( "SecondViewController")に変数を渡そうとしています。Stack Overflowでいくつかのコードが見つかりましたが、エラーが発生していて、何が間違っているのか分かりません。持っている:変数を共有する

私が持っている第2のビューコントローラで
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?)以下の2つのView Controllerのすべてのコードを投稿して、役立つかどうか確認しています。私はコードの厄介さをお詫びします。ここで最初のビューコントローラのコードは次のとおりです。

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. 

      } 
     } 
    } 

第2のビューコントローラコード:

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について知らないので、第2のビューコントローラのあなたのキャストは、間違っています。

はこれを変更してみてください:

var secondVC = segue!.SecondViewController as  ViewController; 

この先:

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

ありがとうございますが、私はまだ同じエラーが発生しています。 –

+0

他の答えを見て、2つの考え:(1)使用しているSwiftのバージョンを明記してください。あなたを助けることは非常に重要です。 (2)より多くのコードを含めてください(あなたのコードは実際にはコンパイルしてはいけません。 '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! 
}