didSelectRowAtIndexPath
とprepareForSegue
方法の両方が@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デリゲートを設定した場合は、セルをクリックしたときに自動的に呼び出されますので
へ
(_差出人:任意)メソッド?同じクラススコープレベルで内部メソッドを実装する必要があります –
何が動作していないか教えてください。たとえば、オブザーブクロージャでは、スナップショットを印刷(スナップショット)しますか? print(userName)はユーザー名を表示しますか?データをどこに渡していますか?それは、配列に格納され、変数に代入された後、インスタンス化されたviewController(ユーザ名を渡さない)に表示されます。 – Jay
こんにちはジェイ、十分正確ではないと申し訳ありません。私の見解では、データの受け渡しだけでは機能しません。したがって、新しいViewcontrollerのラベルは空白のままです。私は他のビューコントローラにデータを渡しています。そこにユーザー名がラベルフィールドに表示されます。本質的に私は詳細(ViewControllerの詳細)を持つテーブルビューを構築しようとします。 –