Метка в ячейке tableview не отображается

#ios #swift #label #tableview

#iOS #swift #метка #просмотр таблицы

Вопрос:

Я создаю tableview с одной ячейкой и извлекаю данные из Firebase для отображения в виде метки firstName . Данные извлекаются (я проверил с помощью инструкции print), однако метка не отображается, даже если альфа установлена в 1. Любая помощь была бы высоко оценена.

Вот мой код:

 import FirebaseDatabase
import FirebaseStorage
import FirebaseAuth
import SwiftKeychainWrapper

class userTableViewController: UITableViewController {

    var profileData = [profileStruct]()
    let storageRef = Storage.storage().reference()
    var databaseRef = Database.database().reference()
    var ref: DatabaseReference?
    var firstName = ""
    var lastName = ""
    var email = ""
    var phoneNumber = ""
    
     override func viewDidLoad() {
         super.viewDidLoad()
         getProfile()
         // Do any additional setup after loading the view.
      //   tableView.register(profileCell.self, forCellReuseIdentifier: "ProfileCell")
     }

     override func didReceiveMemoryWarning() {
         super.didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
     
     
     struct profileStruct {
         let email : String!
         let phoneNumber : String!
         let firstName : String!
         let lastName : String!
     }
     
    @IBAction func signOut(_ sender: Any) {
        KeychainWrapper.standard.removeObject(forKey: "uid")
        do {
            try Auth.auth().signOut()
        } catch let signOutError as NSError {
            print ("Error signing out: %@", signOutError)
        }
        dismiss(animated: true, completion: nil)
    }
    
    func getProfile() {
        let databaseRef = Database.database().reference()
        databaseRef.child("users").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: {
                    snapshot in
            self.firstName = ((snapshot.value as? NSDictionary)!["firstname"] as? String)!
            self.lastName = ((snapshot.value as? NSDictionary)!["lastname"] as? String)!
            self.email = ((snapshot.value as? NSDictionary)!["email"] as? String)!
            self.phoneNumber = ((snapshot.value as? NSDictionary)!["phone number"] as? String)!
            print(self.firstName)
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                })
    }
    

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         return 1
     }
    
    
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
      //  tableView.dequeueReusableCell(withIdentifier: "PostCell")!.frame.size.height
        return 500
    }
     
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCell") as? profileCell else { return UITableViewCell() }
         cell.firstNameLabel?.text = "first name: "   firstName
         cell.lastNameLabel?.text = "last name: "   lastName
         cell.emailLabel?.text = "email: "   email
         cell.phoneNumberLabel?.text = "phone number: "   phoneNumber
         return cell
     }

}
  

Ответ №1:

  1. Добавьте точку останова guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCell") as? profileCell else { return UITableViewCell() } , вам нужно проверить, as? profileCell выполнено ли это успешно, и проверьте, вызвано ли Data Source .
  2. Если первый шаг работает, вам нужно проверить profileCell макет пользовательского интерфейса. Откройте Debug View Hierarchy и проверьте, есть ли какая-либо ячейка в TableView.

Комментарии:

1. И название userTableViewController amp; profileCell должно начинаться с заглавной буквы. 😄 Способ, которым вы пишете это, применим к объявлению экземпляра.

2. Вызывается точка останова, что касается иерархии представлений отладки, я вижу контур ячейки, но не вижу метки

3. @sam Возвращает ли она profileCell строку в DataSource ?

4. Вы можете увидеть вид TableViewCell в Debug View Hierarchy , если вид является UITableViewCell amp; не profileCell , вам нужно зарегистрировать profileCell в viewDidLoad . Но если ячейка есть profileCell , вам нужно проверить макет пользовательского интерфейса в классе profileCell .

5. Элементы теперь отображаются! Но ограничения не применяются, есть какая-нибудь причина, почему?

Ответ №2:

 func getProfile() {
let databaseRef = Database.database().reference()
databaseRef.child("users").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: {
            snapshot in
    self.firstName = ((snapshot.value as? NSDictionary)!["firstname"] as? String)!
    self.lastName = ((snapshot.value as? NSDictionary)!["lastname"] as? String)!
    self.email = ((snapshot.value as? NSDictionary)!["email"] as? String)!
    self.phoneNumber = ((snapshot.value as? NSDictionary)!["phone number"] as? String)!
    print(self.firstName)
self.tableView.dataSource = self
self.tableView.delegate = self
    self.tableView.reloadData()
 })}
  

Комментарии:

1. Попробуйте вызвать DataSource и делегировать, надеюсь, это сработает

2. Я использовал этот код, однако по-прежнему не отображаются метки, даже с заданным текстом. Есть ли что-нибудь еще, что я могу попробовать?

3. Да, вы можете сохранить свои данные firebase в одном классе модели в виде массива или словаря, а затем попытаться отобразить в tableview. Это сработает.

Ответ №3:

Кажется, вы показываете здесь адрес электронной почты вместо имени.

 cell.emailLabel?.text = "email: "   firstName
cell.phoneNumberLabel?.text = "phone number: "   lastName
cell.firstNameLabel?.text = "first name: "   email
cell.lastNameLabel?.text = "last name: "   phoneNumber