#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:
- Добавьте точку останова
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProfileCell") as? profileCell else { return UITableViewCell() }
, вам нужно проверить,as? profileCell
выполнено ли это успешно, и проверьте, вызвано лиData Source
. - Если первый шаг работает, вам нужно проверить
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