2017-07-11 6 views
1

私は気にせず、ビューコントローラ間でデータをやりとりし、それに沿ってfirebaseを使う方法を学ぼうとしています。これは新しいコントローラへの私のセグメントで、私が押しているビューコントローラ上の変数を設定しています。ビューコントローラ間で変数を設定する

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let viewController = storyboard?.instantiateViewController(withIdentifier: "UserInfoViewController") as! UserInfoViewController 
    viewController.uidPassed = userUIDArray[indexPath.row] 
    self.present(viewController, animated: true, completion: nil) 
} 

変数が新しい文字列として宣言されている新しいコントローラに接続します。私はこれを実行するために行くと、それは文字列が空であると言ってそれがクラッシュする。私はそれを印刷することができ、それはviewDidAppearメソッドでは空ですが、前のコントローラでクリックしたときの変数に格納されているUIDを持つviewDidLoadメソッドです。あるビューコントローラから別のビューコントローラに変数を正しく渡していないのですか?

override func viewDidAppear(_ animated: Bool) { 

    databaseRef.child("Users").child(self.uidPassed).child("Name").observe(.value, with: { (snapshot) in 
     let name = snapshot.value as! String 
     print(name) 
    }) 
+1

コードが正しいように見えます。 'didSelectRowAt'メソッドでそのuidPassedを印刷しようとしましたか?あなたのストーリーボードでは、これら2つのView ControllerをSegueで接続していませんか? –

+0

それはそれでした。私はセグーでそれらを接続していた。私はそれを削除し、それは今完璧に実行されます。 – user3103854

+0

私はそれを包んで答えに入れます。基本的には、2つのデータ渡しメソッドを組み合わせていて、明らかにそれがうまくいきません。期待していること –

答えて

1

1つのビューコントローラから別のビューコントローラにデータを渡す主な方法は2つあります。

最初に、あなたのセルをストーリーボードの宛先ビューコントローラーに接続できます。この場合、storyboardのsegueのタイプを定義し、storyboardのsegueの識別子を定義する必要があります。あなたがデータを渡したいときは、prepareForSegue方法でそれを行う必要があり、この

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destinationViewController = segue.destination as? YourTableViewController { 

     destinationViewController.texts = self.texts 
     //... 
    } 
} 

第二のように、あなたはあなたの例でやろうとしているかのように、プログラム的にこれを行うことができます。この場合、ストーリーボードのsegueでView Controllerを接続しないでください。代わりに、宛先ビューコントローラ自体の識別子を設定します。次に、コード内でそのコントローラを開始し、開始されたビューコントローラオブジェクトにプロパティを設定し、次に例のように表示します。

希望に役立ちます。

0

これはタイピングの問題のようです。 userUIDArrayはUIDの配列を保持しています(これはどのタイプなのかわかりません)、それをviewController.uidPassedに割り当てようとしていますが、それは文字列を期待しているようです。他のオプションはuserUIDArray変数が保持している値のどんなタイプにuidPassedの種類を変更することである

viewController.uidPassed = userUIDArray[indexPath.row] as! String

:これを試してみてください。

+0

配列と変数の両方がstring型です。 – user3103854

+0

例をuserUIDArrayの定義で更新できますか?どちらかが文字列を保持していないか、値が適切に割り当てられていません。あなたはdidSelectRowAtの一番上にuserUIDArrayの値を表示してこれを少しテストすることができます。 –

+0

私はテストを行い、その変数を出力するためにそのビューコントローラにボタンを接続しました。変数を配列から取得するのではなく、単純な文字列に設定しました。ボタンを介して変数を出力しないため、変数を渡さないようにします。 – user3103854

関連する問題