Я пытаюсь получить некоторую информацию из базы данных, чтобы установить определенные функции кнопки. Я могу правильно установить заголовок и цвет фона. Однако действие кнопки остается тем же.
, на мой взгляд, пользователь нажимает кнопку, которая сохраняет информацию в базе данных, затем название кнопки и фон меняются. когда пользователь нажимает кнопку, инициируемый код начинается с 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)
})
}
Код для обоих очень идентичен вместо нескольких незначительных изменений, но предполагается, что он будет сохранен в двух разных деревьях в базе данных.
Поскольку фон цвета и заголовка кнопки успешно изменяется, я не понимаю, почему действия кнопки не выполняются?
Я могу добавить изображения, если это слишком запутанно.