2017-05-29 5 views
0

私はios devを初めて使用しています。私は最初のアプリを開発しようとしています! :) これまでのところ良い... 私はメインコントローラからデータをアイテム詳細ビューに渡そうとしています。Swift 3メインコントローラからFirebaseとSegueでコントローラを表示するためのデータ

は、私が間違ってやっているかを把握することができないようだが、私はエラーを取得しておいてください。 「致命的なエラー:オプションの値アンラップしながら、予想外にnilを見つけ、」私は価値があることを理解し、今

-------> MainVC 

    struct Ananlysys { 
    var descrizione: String! 
    var data: String! 
    var immagine: String! 
    var seganle: String! 
    var oraUpload: String! 
    var valuta: String! 
} 

var analysisList = [Ananlysys]() 

var alertsRef = FIRDatabase.database().reference().child("analisi") 

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchDataFromDB()   
} 

func fetchDataFromDB(){ 
    alertsRef.observe(.childAdded, with: { snapshot in 

     if let dict = snapshot.value as? [String: AnyObject] { 
      let descrizione = dict["descrizione"] as! String 
      let data = dict["data"] as! String 
      let stato = dict["stato"] as! String 
      let immagine = dict["imageURL"] as! String 
      let seganle = dict["segnale"] as! String 
      let oraUpload = dict["oraupload"] as! String 
      let valuta = dict["valuta"] as! String 

      self.analysisList.insert(Ananlysys(descrizione: descrizione, 
        data:data, immagine:immagine, seganle: seganle, oraUpload: oraUpload, 
        valuta: valuta), at: 0) 
      self.tableView.reloadData() 
     } 
    }) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ItemDetailVC"{ 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let destination = segue.destination as! ItemDetailVC 
      let cell = tableView.cellForRow(at: indexPath) as? ItemCell 
      destination.valuta = (cell?.valutaLabel.text)! 
      destination.segnale = (cell?.signalLabel.text)! 
      destination.desc = (cell?.descriptionLabel.text)! 
      destination.immagine = (cell?.imageThumb.image)! 
     } 
    } 

と(先である)私のItemDetailsVCコントローラに私はちょうどIBoutletを作成しました: はここに私のコードです...割り当てられていないが、私はなぜ理解していません。ここでは」コード:

class ItemDetailVC: OpenAlertsVC { 

    @IBOutlet weak var crossLabel: UILabel! 
    @IBOutlet weak var signalLbl: UILabel! 
    @IBOutlet weak var imageDetail: UIImageView! 
    @IBOutlet weak var analysisDesc: UILabel! 

    var valuta = "" 
    var segnale = "" 
    var immagine: UIImage! 
    var desc = "" 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
     crossLabel.text = valuta 
     signalLbl.text = segnale 
     analysisDesc.text = desc 
     imageDetail.image = immagine 
} 

は、おそらく私はいくつかの愚かなエラーをやっている... :)しかし、それは私の最初のアプリだと私は本当にこれを理解する方法がわかりません!

誰かが助けてくれると助かりましたか? :)

ありがとう! 乾杯!

更新日: 私の問題は画像のためだと思います。

destination.immagine = (cell?.imageThumb.image)! 

:私はこれを行うセグエで

cell.imageThumb.downloadImageFrom(link: url!, contentMode: 
    UIViewContentMode.scaleToFill) 

let url = analysisList[indexPath.row].immagine 

をして、私は画像の非同期(async)ダウンロード: 私は私がこのようにfirebaseからretrive URLを持っています私のDetailVCで:

var immagine: UIImage! 
imageDetail.image = immagine 

これはエラーの画面です enter image description here

+0

に次のビューで、[表示コントローラ間でデータを受け渡す]の可能な複製を受け取る変数を入れていることを確認してください://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Chris

+0

エラーが発生している行は何ですか?もしあなたがわからないのであれば、あなたのコードにブレークポイントを追加し、クラッシュするまで一度に1行ずつ進んでください。 – Jay

+0

それは私が画像に問題があるようだ...私は取得するfirebaseのURLを持っているが、私はそれを渡すことができないと思われる...そしてそれは私にエラーが見つからない – Marco

答えて

0

ビュー間で最近渡された変数を見ました。最初に値をトップレベル変数(行が選択されている場合)に設定してから、セグル準備関数中にその変数を再参照することによって、それらを動かすことができました。お役に立てれば。

var valuta: String! 

ブレイクアウトそれ自身のデリゲートにself.tableView.indexPathForSelectedRowセクション:

は、トップレベルの変数を設定します。このチュートリアルは素晴らしい例です。 (http://shrikar.com/swift-ios-tutorial-uisearchbar-and-uisearchbardelegate

"didSelectRowAt indexPath"デリゲートを使用して、最上位の変数値を設定します。準備関数へ

func tableView(_ tableView: UITableView, didSelectRowAt IndexPath: IndexPath){ 
    let cell = tableView.cellForRow(at: indexPath)! 
    valuta = cell?.valutaLabel.text 
} 

サンプル調整:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){ 
    if segue.identifier == "ItemDetailVC"{ 
     if let destination = 
      segue.destination as? name_of_your_next_view_controller { 
       destination.passedValuta = valuta 
    } 
} 

HTTPS(

var passedValuta: String! 
+0

ありがとうございました!それを解決!それは実際に私の悪い...コードが動作していた...私は、テスト中にItemDetailVCの宣言を変更したことを忘れていた、それはUIviewControllerではなかった....私はダムだ! :D – Marco

関連する問題