ios - 将 Eureka 表单数据上传到 firebase

标签 ios swift firebase firebase-realtime-database eureka-forms

我有一个 Eureka 表单 View 的用户配置文件。在此空间中,用户可以更新他们的个人资料。如果用户单击“保存”,则会调用此函数。

    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!")
    }



}

该函数的工作是从表单中提取所有数据,将其放入数组中,然后上传到 firebase。如果用户单击“保存”并且不更新任何信息,一切都很好,但是如果他们编辑其个人资料并单击“保存”,则会导致错误。见下文。

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


}

我无法弄清楚是什么导致了此错误发生!

最佳答案

您面临的问题是由于添加具有相同标签字符串值的行或部分引起的。在 Eureka Forms 中,单元格甚至部分的标签应该是唯一的,因此如果您添加具有相同标签的 2 行,这将导致断言异常

您的代码的几个部分中有这种类型的行为,但我将以名称行为例

 <<< 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_NAMEString 在项目的某些部分定义,此字符串不会更改,当您要从此方法添加第二个结果时

databaseRef.child("profiles").child(userID!).observe(.value, with: { (snapshot) in

您的应用崩溃是因为您第二次添加具有相同值“profileDisplayName”的 Constants.PROFILE_DISPLAY_NAME

解决此问题的方法

作为此问题的可能解决方案,您可以为获取的每个用户附加一个唯一值,例如 userID

修复了 NameRow 案例的代码

 <<< NameRow(){ row in

                row.title = "Name"
                row.placeholder = "Enter Name"
                row.value = PROFILE_DISPLAY_NAME
                row.tag = "\(Constants.PROFILE_DISPLAY_NAME)\(userID)"  

                }

关于ios - 将 Eureka 表单数据上传到 firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45804253/

相关文章:

javascript - Firebase 函数 - 写入数据库

ios - INIntent 属性可以指定值 "Ask Each Time"吗?

ios - HUD 在 iOS 中不工作

Swift DidSelectRowAt 没有开火

ios - AVCaptureAudioDataOutputSampleBufferDelegate 未调用 captureOutput

ios - 如何修复 UITableView 类,该类在 Firebase 数据库上重复读取两次元素,并且在加载时表为空?

ios - firebase 不总是通过 APNs 发送通知吗?

javascript - 无法使用console.log()

ios - 'tableview:canEditRowAtIndexPath:' 实现中的返回类型冲突

ios - 定义了另一个 init 方法,但是 initWithNibName :bundle is still called by system