Загрузить данные формы Eureka в Firebase
У меня есть профиль пользователя, который является представлением формы Eureka. В этом пространстве пользователи могут обновить свой профиль. Если пользователь нажимает "Сохранить", он вызывает эту функцию.
func saveProfileSettings(){
let userID = user?.uid
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let PROFILE_DISPLAY_NAME_REF: NameRow? = form.rowBy(tag: Constants.PROFILE_DISPLAY_NAME)
let PROFILE_DISPLAY_NAME = PROFILE_DISPLAY_NAME_REF?.value
let PROFILE_EMAIL_REF: EmailRow? = form.rowBy(tag: Constants.PROFILE_EMAIL)
let PROFILE_EMAIL = PROFILE_EMAIL_REF?.value
let PROFILE_PHONENUMBER_REF: PhoneRow? = form.rowBy(tag: Constants.PROFILE_PHONENUMBER)
let PROFILE_PHONENUMBER = PROFILE_PHONENUMBER_REF?.value
let PROFILE_BIRTH_AGE_REF: DateRow? = form.rowBy(tag: Constants.PROFILE_BIRTH_AGE)
let PROFILE_BIRTH_AGE_CONVERT = PROFILE_BIRTH_AGE_REF?.value
let PROFILE_BIRTH_AGE = formatter.string(from: PROFILE_BIRTH_AGE_CONVERT!)
let PROFILE_BIRTH_AGE_String = String(PROFILE_BIRTH_AGE)
let PROFILE_GENDER_REF: SegmentedRow<String>! = form.rowBy(tag: Constants.PROFILE_GENDER)
let PROFILE_GENDER = PROFILE_GENDER_REF.value
let PROFILE_GENDER_INTEREST_REF: SegmentedRow<String>! = form.rowBy(tag: Constants.PROFILE_GENDER_INTEREST)
let PROFILE_GENDER_INTEREST = PROFILE_GENDER_INTEREST_REF.value
let uploadPath = databaseRef.child("profiles").child(userID!)
let dataBlock = ["\(Constants.PROFILE_DISPLAY_NAME)": PROFILE_DISPLAY_NAME!, "\(Constants.PROFILE_EMAIL)": PROFILE_EMAIL!, "\(Constants.PROFILE_PHONENUMBER)": PROFILE_PHONENUMBER!, "\(Constants.PROFILE_BIRTH_AGE)": PROFILE_BIRTH_AGE_String!, "\(Constants.PROFILE_GENDER)": PROFILE_GENDER!, "\(Constants.PROFILE_GENDER_INTEREST)": PROFILE_GENDER_INTEREST!]
print("DataBlock \(dataBlock)")
uploadPath.setValue(dataBlock) { (error, datebaseRef) in
if error != nil{
print("Error Occured")
}
print("Profile Updated!")
}
}
Задача этой функции - извлечь все данные из формы, поместить их в массив, а затем загрузить их в базу данных. Если пользователь нажимает "Сохранить" и не обновляет какую-либо информацию, все в порядке, однако, если он редактирует свой профиль и нажимает "Сохранить", это вызывает ошибку. Увидеть ниже.
assertion failed: Duplicate tag profileDisplayName: file /Users/brandonmayhew/Documents/Programming/X-Code Project's/ChristinaApp/Pods/Eureka/Source/Core/BaseRow.swift, line 172
2017-08-21 12:19:19.258586-0700 ChristinaApp[2615:926887] assertion failed: Duplicate tag profileDisplayName: file /Users/brandonmayhew/Documents/Programming/X-Code Project's/ChristinaApp/Pods/Eureka/Source/Core/BaseRow.swift, line 172
Если вы хотите увидеть, что такое код для создания формы, он находится в моем 'viewDidLoad'
override func viewDidLoad() {
super.viewDidLoad()
self.startAnimating(Constants.animationSize, message: "Finding Your Profile", type: .ballZigZag)
//findImageURL()
//START
let userID = user?.uid
print("Logged in user: \(userID!)")
databaseRef.child("profiles").child(userID!).observe(.value, with: { (snapshot) in
let data = snapshot.value as? NSDictionary
let PROFILE_DISPLAY_NAME = data?[Constants.PROFILE_DISPLAY_NAME] as? String
let PROFILE_UID = data?[Constants.PROFILE_UID] as? String
let PROFILE_IMAGE = data?[Constants.PROFILE_IMAGE] as? String
let PROFILE_EMAIL = data?[Constants.PROFILE_EMAIL] as? String
let PROFILE_PHONENUMBER = data?[Constants.PROFILE_PHONENUMBER] as? String
let PROFILE_GENDER = data?[Constants.PROFILE_GENDER] as? String
let PROFILE_GENDER_INTEREST = data?[Constants.PROFILE_GENDER_INTEREST] as? String
let PROFILE_BIRTH_AGE = data?[Constants.PROFILE_BIRTH_AGE] as? String
let PROFILE_LATITUDE = data?[Constants.PROFILE_LATITUDE] as? String
let PROFILE_lONGITUDE = data?[Constants.PROFILE_lONGITUDE] as? String
self.form +++ Section("Personal Information")
<<< NameRow(){ row in
row.title = "Name"
row.placeholder = "Enter Name"
row.value = PROFILE_DISPLAY_NAME
row.tag = "\(Constants.PROFILE_DISPLAY_NAME)"
}
<<< EmailRow(){ row in
row.title = "Email"
row.placeholder = "Enter Email"
row.value = PROFILE_EMAIL
row.tag = "\(Constants.PROFILE_EMAIL)"
}
<<< PhoneRow(){ row in
row.title = "Phone Number"
row.placeholder = "Enter Phone Number"
row.value = PROFILE_PHONENUMBER
row.tag = "\(Constants.PROFILE_PHONENUMBER)"
}
<<< DateRow(){ row in
row.title = "Your Birth Year"
//Convert 'PROFILE_BIRTH_AGE' string to NSDATE
let date = NSDate()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let formattedDate = dateFormatter.date(from: PROFILE_BIRTH_AGE!)
row.value = formattedDate
row.tag = "\(Constants.PROFILE_BIRTH_AGE)"
}
+++ Section("Dating Settings")
<<< SegmentedRow <String> (){ row in
row.title = "I am"
row.options = ["Male", "Female"]
row.value = PROFILE_GENDER
row.tag = "\(Constants.PROFILE_GENDER)"
}
<<< SegmentedRow <String> (){ row in
row.title = "I'm interested in"
row.options = ["Male", "Female"]
row.value = PROFILE_GENDER_INTEREST
row.tag = "\(Constants.PROFILE_GENDER_INTEREST)"
}
+++ Section("Save Profile")
<<< ButtonRow() {
$0.title = "Save"
}
.onCellSelection { cell, row in
self.saveProfileSettings()
}
+++ Section("Come Back Later")
<<< ButtonRow() {
$0.title = "Sign Out"
}
.onCellSelection { cell, row in
self.signOut()
}
self.stopAnimating()
})
//STOP
}
Я не могу понять, из-за чего происходит эта ошибка!
1 ответ
Проблема, с которой вы сталкиваетесь, вызвана добавлением строк или разделов с одинаковым значением тега String. В Eureka Forms теги для ячеек или даже разделов должны быть уникальными, поэтому, если вы добавляете 2 строки с одинаковым тегом, это вызовет исключение assert
У вас есть такой тип поведения в нескольких частях вашего кода, но я возьму строку с именем в качестве примера
<<< NameRow(){ row in
row.title = "Name"
row.placeholder = "Enter Name"
row.value = PROFILE_DISPLAY_NAME
row.tag = "\(Constants.PROFILE_DISPLAY_NAME)"
}
как вы видете row.tag = "\(Constants.PROFILE_DISPLAY_NAME)"
это линия, вызывающая проблему, я предполагаю, что Constants.PROFILE_DISPLAY_NAME
это String
определенная в некоторой части вашего проекта, эта строка не изменяется, и когда вы собираетесь добавить свой второй результат из этого метода
databaseRef.child("profiles").child(userID!).observe(.value, with: { (snapshot) in
сбой вашего приложения, потому что вы добавляете Constants.PROFILE_DISPLAY_NAME
во второй раз с тем же значением "profileDisplayName"
способ это исправить
В качестве возможного решения этой проблемы, вы можете добавить уникальное значение для каждого пользователя, скажем, скажем userID
Исправлен код для случая NameRow
<<< NameRow(){ row in
row.title = "Name"
row.placeholder = "Enter Name"
row.value = PROFILE_DISPLAY_NAME
row.tag = "\(Constants.PROFILE_DISPLAY_NAME)\(userID)"
}