อัปโหลดข้อมูลแบบฟอร์ม Eureka ไปยัง firebase

ฉันมีโปรไฟล์ผู้ใช้ที่เป็นมุมมองแบบฟอร์มยูเรก้า ในพื้นที่นี้ผู้ใช้สามารถอัปเดตโปรไฟล์ของตนได้ หากผู้ใช้คลิก 'บันทึก' จะเรียกใช้ฟังก์ชันนี้

    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


}

ฉันไม่สามารถเข้าใจได้ว่าอะไรทำให้เกิดข้อผิดพลาดนี้เกิดขึ้น!


person BrandonMayU    schedule 21.08.2017    source แหล่งที่มา
comment
ดูเหมือนว่าชื่อ profileDisplayName จะซ้ำกัน   -  person ryantxr    schedule 21.08.2017
comment
ฉันได้สแกนทุกอย่างแล้วและฉันสามารถค้นหารายการที่ซ้ำกันได้   -  person BrandonMayU    schedule 21.08.2017
comment
คุณช่วยโพสต์โค้ดแบบฟอร์มยูเรก้าของคุณได้ไหม? @แบรนดอนเมย์ยู   -  person Reinier Melian    schedule 22.08.2017
comment
@ReinierMelian ฉันได้อัปเดตคำถามของฉันแล้ว หวังว่าคุณจะช่วยได้!   -  person BrandonMayU    schedule 22.08.2017
comment
@ReinierMelian ขอบคุณ   -  person BrandonMayU    schedule 28.08.2017
comment
@ReinierMelian มีอะไรอีกไหม?   -  person BrandonMayU    schedule 28.08.2017


คำตอบ (1)


ปัญหาที่คุณพบมีสาเหตุมาจากการเพิ่มแถวหรือส่วนที่มีค่าแท็กสตริงเดียวกัน ใน 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_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)"  

                }
person Reinier Melian    schedule 27.08.2017