2016-11-20 16 views
-5

私はこのtableviewを持っており、ユーザー名をView Controllerに渡してラベルに表示したいのですが、動作しません。ユーザー名はfirebaseデータベースから来ます。私は他の質問もチェックしましたが、私の問題にそれを採用することはできません。 (実際、私は目的を理解することはできませんデータの受け渡しTableview - > ViewController

import UIKit 

class CallDetail: UIViewController { 

    @IBOutlet weak var UserName: UILabel! 
    var stringPassed = String() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     UserName = stringPassed.text 
    } 
} 
+0

let nameLbl = cell?.viewWithTag(1) as! UILabel nameLbl.text = self.Users[indexPath.row].username 

(_差出人:任意)メソッド?同じクラススコープレベルで内部メソッドを実装する必要があります –

+0

何が動作していないか教えてください。たとえば、オブザーブクロージャでは、スナップショットを印刷(スナップショット)しますか? print(userName)はユーザー名を表示しますか?データをどこに渡していますか?それは、配列に格納され、変数に代入された後、インスタンス化されたviewController(ユーザ名を渡さない)に表示されます。 – Jay

+0

こんにちはジェイ、十分正確ではないと申し訳ありません。私の見解では、データの受け渡しだけでは機能しません。したがって、新しいViewcontrollerのラベルは空白のままです。私は他のビューコントローラにデータを渡しています。そこにユーザー名がラベルフィールドに表示されます。本質的に私は詳細(ViewControllerの詳細)を持つテーブルビューを構築しようとします。 –

答えて

0

didSelectRowAtIndexPathprepareForSegue方法の両方が@IBAction func ShowDetail(_ sender: Any)の外にする必要があります:私は、コーディングの専門家ではないです:

import Foundation 
import UIKit 
import Firebase 
import FirebaseDatabase 
import FirebaseAuth 

struct user { 
    let username : String! 
} 

class MainScreen: UITableViewController { 

    var Users = [user]() 

    override func viewDidLoad() { 

    let databaseRef = FIRDatabase.database().reference() 

    databaseRef.child("users").queryOrderedByKey() 
       .observe(.childAdded, with: { snapshot in 

     print(snapshot) 
     let username = (snapshot.value as? NSDictionary)!["username"] as! String 
     print(username) 
     self.Users.append(user(username: username)) 
     self.tableView.reloadData() 
     print(self.Users) 
    }) 
} 

override func tableView(_ tableView: UITableView, 
         numberOfRowsInSection section: Int) -> Int { 
    return Users.count 
} 

override func tableView(_ tableView: UITableView, 
         cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 
    let nameLbl = cell?.viewWithTag(1) as! UILabel 
    nameLbl.text = self.Users[indexPath.row].username 
    return cell! 
    } 

@IBAction func ShowDetail(_ sender: Any) { 
    var selectedLabel:String? 

    func tableView(tableView: UITableView, 
        didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("Row \(indexPath.row)selected") 
     selectedLabel = self.Users[indexPath.row].username 
     performSegue(withIdentifier: "detailView", sender: self) 
    } 

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if(segue.identifier == "detailView") { 
      let vc = segue.destination as! CallDetail 
      vc.stringPassed = selectedLabel! 
     } 
    } 
} 

と受信のViewControllerは、このようになりますその):

は、インスタンス変数としてselectedLabelを宣言し、メソッドを分離:

import Foundation 
import UIKit 
import Firebase 
import FirebaseDatabase 
import FirebaseAuth 

struct user { 
    let username : String! 
} 

class MainScreen: UITableViewController { 

    // 'selectedLabel' should be here: 
    var selectedLabel:String? 

    var Users = [user]() 

    override func viewDidLoad() { 

     let databaseRef = FIRDatabase.database().reference() 

     databaseRef.child("users").queryOrderedByKey().observe(.childAdded, with: { 
      snapshot in 

      print(snapshot) 

      let username  = (snapshot.value as? NSDictionary)!["username"] as! String 

      print(username) 

      self.Users.append(user(username: username)) 

      self.tableView.reloadData() 

      print(self.Users) 

     }) 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return Users.count 
    } 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") 

     let nameLbl = cell?.viewWithTag(1) as! UILabel 

     nameLbl.text = self.Users[indexPath.row].username 

     return cell! 

    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     print("Row \(indexPath.row)selected") 
     selectedLabel = self.Users[indexPath.row].username 
     performSegue(withIdentifier: "detailView", sender: self) 
    } 

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if(segue.identifier == "detailView") { 
      let vc = segue.destination as! CallDetail 

      vc.stringPassed = selectedLabel! 
     } 
    } 

    // just remove it if you don't need it... 
    @IBAction func ShowDetail(_ sender: Any) { 

    } 

} 

また、tableViewデータソースとデリゲートがviewControllerに接続されていることを確認してください。あなたはViewControllerをするのtableViewデリゲートを設定した場合は、セルをクリックしたときに自動的に呼び出されますので

+0

Ahmedに感謝しますが、それでも動作しません。私はコンパイラで次のエラーが発生します:致命的なエラー:予期せず、オプションの値をアンラップしながらnilを見つけました –

+0

このエラーが生成されたコードをデバッグしますか? –

+0

エラーはDetailViewControllerで生成されます。 class CallDetail:UIViewController { @IBOutlet weak var UserName:UILabel! var stringPassed:String? のviewDidLoad FUNCオーバーライド(){ super.viewDidLoad() UserName.text = stringPassed –

0

まずあなたが

tableView(tableView: UITableView, didSelectRowAtIndexPathを削除する必要があります。

prepareForSegueは、performSegue(withIdentifier: "detailView", sender: self)の後に呼び出され、ShowDetail(_ sender: Any)を削除する必要はありません。

と変更これらの行のfunc Sh​​owDetailの目的は何

cell.textLabel?.text = self.Users[indexPath.row].username 
関連する問題