выдает информацию о вызовах из firebase для установки заголовков кнопок - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь получить некоторую информацию из базы данных, чтобы установить определенные функции кнопки. Я могу правильно установить заголовок и цвет фона. Однако действие кнопки остается тем же.

, на мой взгляд, пользователь нажимает кнопку, которая сохраняет информацию в базе данных, затем название кнопки и фон меняются. когда пользователь нажимает кнопку, инициируемый код начинается с handleConfirm. этот код работает отлично, сохраняет все данные в базе данных, а что нет.

    @objc func handleConfirm() {
           let workUser = self.workerUser
           let username = workUser?.name
           let post = notification?.poster
           let jobTitle = post?.category


           let alert = UIAlertController(title: "Ready? ",message:" Are you ready to complete the job \(jobTitle!) for \(username!) ?", preferredStyle: UIAlertController.Style.alert)

           let cancelButton = UIAlertAction(title: "Cancel", style: .default, handler: {(_ action: UIAlertAction) -> Void in
                  print("you pressed Yes, please button")
              })

           let continueButton = UIAlertAction(title: "Get to Work!", style: .default, handler: {(_ action: UIAlertAction) -> Void in
            self.fetchJobProgress()
            self.updateNSaveJobProgress()
            let hud = JGProgressHUD(style: .dark)
                  hud.textLabel.text = "Confirming!"
                    hud.show(in: self.view)


            hud.dismiss()
              })

           continueButton.setValue(GREEN_Theme, forKey: "titleTextColor")
           cancelButton.setValue(UIColor.red, forKey: "titleTextColor")
           alert.addAction(cancelButton)
           alert.addAction(continueButton)
           self.present(alert, animated: true, completion: nil)
}

func updateNSaveJobProgress() {
    let workUser = self.workerUser
    let uid = Auth.auth().currentUser?.uid
    let workerId = workUser?.uid
    let address = workerUser?.address
     let createDate = Int(NSDate().timeIntervalSince1970)

    Database.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String : Any] else { return }
        let user = User(dictionary: dictionary as [String : AnyObject])
        workUser?.uid = snapshot.key

        let docData: [String: Any] = ["workerId": uid!,
                                      "creationDate": createDate,
                                      "fromId" : workerId!,
                                      "location": address,
                                      "type": 2,
                                      "checked": 0,]

        self.postJobNotificationsIntoDatabseWithUID(uid: workerId!, values: docData as [String : AnyObject])
        self.updateUserDataIntoDatabseWithUID(uid: uid!, values: docData as [String : AnyObject])
        JOB_POST_REF.child(uid!).child("progress?").setValue(2)

     }, withCancel: { (err) in
        print("attempting to load information")
        })

        print("Finished saving user info")
        self.dismiss(animated: true, completion: {
            print("Dismissal complete")
        })


    }

    private func updateUserDataIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
        let hud = JGProgressHUD(style: .dark)
        hud.textLabel.text = "Saving"
        hud.show(in: view)

        let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
                    let usersReference = ref.child("workInProgress").child(uid).childByAutoId()
                    usersReference.setValue(values, withCompletionBlock: { (err, ref) in
                    if err != nil {
                        print("error saving data into firebase")
                        return
                    }

                    hud.dismiss()
                    self.dismiss(animated: true, completion: nil)
                })

    }

 private func postJobNotificationsIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
        let usersReference = ref.child("notifications").child(uid).childByAutoId()
        usersReference.setValue(values, withCompletionBlock: { (err, ref) in
        if err != nil {
            print("error saving data into firebase")
            return
        }
    })
}

после этого мы хотим вызвать fetchJobProgress (), который устанавливает вид кнопки, если пользователь нажал кнопку один или два раза. обратите внимание, что при

if type==userNotifications.NotificationType.inProgress.rawValue {

}

, если я раскомментирую isuserinteractionenabled = false, пользователь не сможет взаимодействовать с кнопкой. Почему?

func fetchJobProgress() {
        let workerId = workerUser?.uid
        let uid = Auth.auth().currentUser?.uid
    Database.database().reference().child("workInProgress").child(uid!).queryOrdered(byChild: "fromId").queryEqual(toValue: workerId).observeSingleEvent(of: .value, with: { (snapshot) in

            guard let dictionary = snapshot.value as? [String : Any] else { return }
        for (_, valueDic) in dictionary {
            guard let dic = valueDic as? [String: Any] else {
                continue
            }
            guard let type = dic["type"] as? Int else {
                continue
            }

            if type == userNotifications.NotificationType.inProgress.rawValue {

                self.confirmButton.setTitle("In Progress...", for: .normal)
                self.confirmButton.backgroundColor = UIColor.lightGray
                //self.confirmButton.isUserInteractionEnabled = false
            self.confirmButton.addTarget(self, action: #selector(self.handleComplete), for: .touchUpInside)

            } else if type == userNotifications.NotificationType.accepted.rawValue {

                self.confirmButton.backgroundColor = GREEN_Theme
                self.confirmButton.addTarget(self, action: #selector(self.handleConfirm), for: .touchUpInside)

            }  else if type == userNotifications.NotificationType.completed.rawValue {

                self.confirmButton.setTitle("Completed!", for: .normal)
                self.confirmButton.backgroundColor = UIColor.lightGray
                self.confirmButton.isUserInteractionEnabled = false

                           }

            break
        }





        }, withCancel: { (err) in
        print("attempting to load information")
        })

    }

Теперь это отлично устанавливает цвет кнопки и заголовок. однако действие кнопки по-прежнему handleConfirm, а не handle complete.

ручка завершена выглядит как

 @objc func handleComplete() {
           let workUser = self.workerUser
           let username = workUser?.name
           let post = notification?.poster
           let jobTitle = post?.category


           let alert = UIAlertController(title: "Completed? ",message:" Did you complete the job \(jobTitle!) for \(username!) ?", preferredStyle: UIAlertController.Style.alert)

           let cancelButton = UIAlertAction(title: "Not Yet!", style: .default, handler: {(_ action: UIAlertAction) -> Void in
                  print("you pressed Yes, please button")
              })

           let continueButton = UIAlertAction(title: "Complete", style: .default, handler: {(_ action: UIAlertAction) -> Void in
            self.fetchJobProgress()
            self.completeJobProgress()
            let hud = JGProgressHUD(style: .dark)
                  hud.textLabel.text = "Confirming!"
                    hud.show(in: self.view)


            hud.dismiss()
              })

           continueButton.setValue(GREEN_Theme, forKey: "titleTextColor")
           cancelButton.setValue(UIColor.red, forKey: "titleTextColor")
           alert.addAction(cancelButton)
           alert.addAction(continueButton)
           self.present(alert, animated: true, completion: nil)
}


func completeJobProgress() {
    let workUser = self.workerUser
    let uid = Auth.auth().currentUser?.uid
    let workerId = workUser?.uid
    let address = workerUser?.address
     let createDate = Int(NSDate().timeIntervalSince1970)

    Database.database().reference().child("users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String : Any] else { return }
        let user = User(dictionary: dictionary as [String : AnyObject])
        workUser?.uid = snapshot.key

        let docData: [String: Any] = ["workerId": uid!,
                                      "creationDate": createDate,
                                      "fromId" : workerId!,
                                      "location": address!,
                                      "type": 3,
                                      "checked": 0,]

        self.setJobToCompletedInDatabase(uid: workerId!, values: docData as [String : AnyObject])
        self.updateUserDataIntoDatabseWithUID(uid: uid!, values: docData as [String : AnyObject])
        JOB_POST_REF.child(uid!).child("progress?").setValue(3)

     }, withCancel: { (err) in
        print("attempting to load information")
        })

        print("Finished saving user info")
        self.dismiss(animated: true, completion: {
            print("Dismissal complete")
        })


    }

    private func setJobToCompletedInDatabase(uid: String, values: [String: AnyObject]) {
        let hud = JGProgressHUD(style: .dark)
        hud.textLabel.text = "Saving"
        hud.show(in: view)

        let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
                    let usersReference = ref.child("completedJob").child(uid).childByAutoId()
                    usersReference.setValue(values, withCompletionBlock: { (err, ref) in
                    if err != nil {
                        print("error saving data into firebase")
                        return
                    }

                    hud.dismiss()
                    self.dismiss(animated: true, completion: nil)
                })

    }

Код для обоих очень идентичен вместо нескольких незначительных изменений, но предполагается, что он будет сохранен в двух разных деревьях в базе данных.

Поскольку фон цвета и заголовка кнопки успешно изменяется, я не понимаю, почему действия кнопки не выполняются?

Я могу добавить изображения, если это слишком запутанно.

1 Ответ

0 голосов
/ 04 марта 2020

Сначала необходимо удалить действие, а затем дать новое действие кнопке:

Следуйте коду:

self.confirmButton.removeTarget(nil, action: nil, for: .allEvents)

Добавляйте эту строку всякий раз, когда вы устанавливаете новое действие.

Обновленный метод:

func fetchJobProgress() {
            let workerId = workerUser?.uid
            let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("workInProgress").child(uid!).queryOrdered(byChild: "fromId").queryEqual(toValue: workerId).observeSingleEvent(of: .value, with: { (snapshot) in

                guard let dictionary = snapshot.value as? [String : Any] else { return }
            for (_, valueDic) in dictionary {
                guard let dic = valueDic as? [String: Any] else {
                    continue
                }
                guard let type = dic["type"] as? Int else {
                    continue
                }

                if type == userNotifications.NotificationType.inProgress.rawValue {
                    self.confirmButton.setTitle("Pending...", for: .normal)
                    self.confirmButton.backgroundColor = UIColor.lightGray
                    self.confirmButton.removeTarget(nil, action: nil, for: .allEvents)
                    self.confirmButton.addTarget(self, action: #selector(self.handleComplete), for: .touchUpInside)
                   // self.confirmButton.isUserInteractionEnabled = false

                } else if type == userNotifications.NotificationType.completed.rawValue {
                    self.confirmButton.setTitle("completed", for: .normal)
                    self.confirmButton.setTitleColor(.black, for: [])
                    self.confirmButton.backgroundColor = .white
                    self.confirmButton.isUserInteractionEnabled = false
                }
                else {
                    self.confirmButton.backgroundColor = GREEN_Theme
                    self.confirmButton.removeTarget(nil, action: nil, for: .allEvents)
                    self.confirmButton.addTarget(self, action: #selector(self.handleConfirm), for: .touchUpInside)

                }

                break
            }





            }, withCancel: { (err) in
            print("attempting to load information")
            })

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...