Я почти закончил исправление огромной проблемы, которая возникла у меня последние несколько недель. Короче говоря, я пытаюсь отправить данные массива в мою базу данных Firebase. Я покажу, что в настоящее время отправляет кнопка отправки, когда я нажимаю кнопку отправки:
база данных
Я бы хотел, чтобы ноль был идентификатором каждого пользователя (по одному узлу для каждой строки). Количество пользователей и их личность определяется таблицей и дочерними значениями, которые должны быть значениями в массиве.
Вот код функции, которая отправляет в firebase:
@IBAction func sendButtonTapped(_ sender: Any) {
let companyNameC = companyNameTextFieldConsiderations.text!.trimmingCharacters(in: .whitespacesAndNewlines)
let companyDescriptionC = companyDescriptionTextFieldConsiderations.text!.trimmingCharacters(in: .whitespacesAndNewlines)
let today = Date()
let formatter1 = DateFormatter()
formatter1.dateFormat = "MMM d y"
print(formatter1.string(from: today))
let todaysDate = formatter1.string(from: today)
let storageRef = Storage.storage().reference(forURL: "MY STORAGE URL HERE")
let imageName = companyNameTextFieldConsiderations.text!
let storageCompanyRef = storageRef.child("Company_Image_Considerations").child("\(todaysDate)").child(imageName)
let companyDescriptionTextFieldText = companyDescriptionTextFieldConsiderations.text
let dateToStart = startDateTextFieldConsiderations.text
let dateToDecide = endDateTextFieldConsiderations.text
let companyRef = Database.database().reference().child("Considerations").child("\(todaysDate)").child(imageName)
let numberOfPeopleCells = ConsiderationsTestViewController.people
let considerationInfluencerRef = Database.database().reference().child("Considerations").child("\(todaysDate)").child(imageName).child("Users").child("\(numberOfPeopleCells.startIndex)")
let values = ["Feed_Quantity": "feedTFC", "Story_Quantity": "storyTFC", "Compensation": "compensationTFC"]
guard let imageSelected = self.CompanyImage.image else {
print ("Avatar is nil")
return
}
var dict: Dictionary<String, Any> = [
"Company Image": "",
"Company Description": companyDescriptionTextFieldText!,
"Start Date": dateToStart!,
"Decision Date": dateToDecide! ]
guard let imageData = imageSelected.jpegData(compressionQuality: 0.5) else {
return
}
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
storageCompanyRef.putData(imageData, metadata: metadata, completion:
{ (StorageMetadata, error) in
if (error != nil) {
return
}
storageCompanyRef.downloadURL { (url, error) in
if let metadateImage = url?.absoluteString {
dict["Company Image"] = metadateImage
companyRef.updateChildValues(dict, withCompletionBlock: {
(error, ref) in
if error == nil {
print("Done")
return
}
}
)
}
}
storageRef.updateMetadata(metadata) { metadata, error in
if error != nil {
//Uh-oh, an error occurred!
} else {
// Updated metadata for 'images/forest.jpg' is returned
}
}
})
considerationInfluencerRef.updateChildValues(values as [AnyHashable : Any]) { (error, ref) in
if error != nil {
print(error ?? "")
return
}
self.navigationController?.popViewController(animated: true)
}
}
Кажется, я не могу сослаться на atIndexPath.row. Затем я бы использовал UID из каждой ячейки для создания узла, а затем к каждому из данных indePath.row добавляли дочерние значения.
Каков наилучший способ действий?
EDIT: Вот структура для людей:
import UIKit
struct Person {
var Name: String?
var PostNumber: String?
var StoryNumber: String?
var Compensation: String?
var ProfileImageUrl: String?
var userID: String?
}
и вот код таблицы:
extension ConsiderationsTestViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ConsiderationsTestViewController.people.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 72
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: AddPersonCell, for: indexPath) as! ConsiderationsCell
let numberOfPeopleCells = ConsiderationsTestViewController.people[indexPath.row]
cell.nameLabelC.text = numberOfPeopleCells.Name
cell.feedLabelC.text = numberOfPeopleCells.PostNumber
cell.storyLabelC.text = numberOfPeopleCells.StoryNumber
cell.compensationLabelC.text = numberOfPeopleCells.Compensation
cell.userImage.loadImageUsingCacheWithUrlString(urlString: numberOfPeopleCells.ProfileImageUrl!)
cell.userImage.layer.cornerRadius = 25
cell.nameLabelC.numberOfLines = 0
return cell
}
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == .delete) {
ConsiderationsTestViewController.people.remove(at: indexPath.row)
// handle delete (by removing the data from your array and updating the tableview)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}
}
РЕДАКТИРОВАТЬ:
Вот пример массива, когда есть 3 пользователя :
3 elements
▿ 0 : Person
▿ Name : Optional<String>
- some : "Person's Name1"
▿ PostNumber : Optional<String>
- some : "1"
▿ StoryNumber : Optional<String>
- some : "1"
▿ Compensation : Optional<String>
- some : "1"
▿ ProfileImageUrl : Optional<String>
- some : "PROFILEIMAGE URL HERE"
▿ userID : Optional<String>
- some : "B2Z4DlZ8RucvEQhz2NSUkquqc5P2"
▿ 1 : Person
▿ Name : Optional<String>
- some : "Person's Name2"
▿ PostNumber : Optional<String>
- some : "1"
▿ StoryNumber : Optional<String>
- some : "11"
▿ Compensation : Optional<String>
- some : "1"
▿ ProfileImageUrl : Optional<String>
- some : "PROFILEIMAGE URL HERE"
▿ userID : Optional<String>
- some : "Lbn9HL1WIpZTMFzpGWAXy7Ra0EA2"
▿ 2 : Person
▿ Name : Optional<String>
- some : "Person's Name3"
▿ PostNumber : Optional<String>
- some : "1"
▿ StoryNumber : Optional<String>
- some : "1"
▿ Compensation : Optional<String>
- some : "1"
▿ ProfileImageUrl : Optional<String>
- some : "PROFILEIMAGE URL HERE"
▿ userID : Optional<String>
- some : "NE6WVUfF6WQjJT9eeVSJgfvrrZW2"