2016-11-20 5 views
-5

У меня есть это табличное представление, и я хотел бы передать имя пользователя контроллеру представления и отобразить его там на ярлыке, но он не работает. Имя пользователя происходит от базы данных firebase. Я также проверял другие вопросы, но не могу принять его к моей проблеме. Я не эксперт в области кодирования:Передача данных Tableview -> Viewcontroller

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 выглядит следующим образом:

import UIKit 

class CallDetail: UIViewController { 

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

    override func viewDidLoad() { 
     super.viewDidLoad() 

     UserName = stringPassed.text 
    } 
} 
+0

то, что цель Func ShowDetail (_ отправителя: Any) метод? вы должны реализовать свой внутренний метод на том же уровне видимости класса –

+0

Можете ли вы рассказать нам, что не работает? Например, при закрытии наблюдения печать (моментальный снимок) печатает моментальный снимок? Печатает (имя_пользователя) имя пользователя? Где вы «передаете» данные? Кажется, он хранится в массиве и затем присваивается переменной после того, как viewController в экземпляре (который не передает имя пользователя) – Jay

+0

Привет, Джей, извините за то, что вы недостаточно точны. Единственное, с моей точки зрения, что это не работает, это передача данных. Таким образом, ярлык в новом Viewcontroller остается пустым. Я передаю данные другому контроллеру представления, и там имя пользователя должно появиться в поле метки. В сущности, я пытаюсь создать табличное представление с детальностью (деталь в Viewcontroller). –

ответ

0

Оба didSelectRowAtIndexPath и prepareForSegue методы должны быть вне @IBAction func ShowDetail(_ sender: Any) (на самом деле, я не могу понять цель из него):

объявить 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.

+0

Спасибо Ахмеду, но он все еще не работает. У меня есть следующая ошибка в компиляторе: фатальная ошибка: неожиданно найден nil при распаковке необязательного значения –

+0

отладить код, где эта ошибка возникла? –

+0

ошибка возникает в DetailViewController: класс CallDetail: UIViewController { @IBOutlet weak var Имя пользователя: UILabel! var stringPassed: String? переопределение функ viewDidLoad() { super.viewDidLoad() UserName.text = stringPassed –

0

Прежде всего, необходимо удалить

tableView(tableView: UITableView, didSelectRowAtIndexPath, потому что он будет вызываться автоматически при нажатии на ячейку, если вы установили делегат Tableview в ViewController.

prepareForSegue будет вызываться после performSegue(withIdentifier: "detailView", sender: self) и удалять ShowDetail(_ sender: Any) не нужно.

и изменить эти строки

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

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

в

cell.textLabel?.text = self.Users[indexPath.row].username 
Смежные вопросы