我的Swift项目遇到一些问题。似乎Firestore函数正在干扰我要在单元格中执行的动画。
This animation of a progress bar going from 0.0 to 1.1 inside a UITableViewCell (screenrecord)
当前,动画无法播放。进度栏 正在更新,但未设置动画。 It looks like this now.
目标和实际结果在TaskCell.swift
中放置了相同的动画代码。与startAnimation()
一起单击时,会调用startActionII()
。
@IBAction func checkBoxAction(_ sender: Any) {
startActionII()
startAnimation()
}
func startAnimation() {
UIView.animate(withDuration: 6.0) {
self.progressBar.setProgress(1.0, animated: true)
}
}
func startActionII() {
if items![indexRow!].checked {
delegate?.changeButton(state: false, indexSection: indexSection!, indexRow: indexRow!, itemID: itemID)
} else {
delegate?.changeButton(state: true, indexSection: indexSection!, indexRow: indexRow!, itemID: itemID)
}
}
这是问题所在。正确调用了委托方法:所有打印语句和Firestore更新均有效。但是,Firestore代码似乎会干扰动画。当我使用下面显示为changeButton()
的代码时,动画不起作用。但是,当我用打印语句替换所有的Firestore代码时,动画确实起作用。这是我的changeButton
委托方法。
func changeButton(state: Bool, indexSection: Int?, indexRow: Int?, itemID: String?) {
print("Doing logic II...")
sections[indexSection!].items[indexRow!].checked = state
let generator = UIImpactFeedbackGenerator(style: .light)
generator.impactOccurred()
if let itemID = itemID {
let itemRef = db.collection(K.FStore.lists).document(currentListID!).collection(K.FStore.sections).document("\(indexSection!)").collection(K.FStore.items).document(itemID)
if sections[indexSection!].items[indexRow!].checked {
itemRef.updateData([
K.Item.isChecked: true,
K.Item.checkedBy: currentUserID!,
K.Item.dateChecked: Date()
]) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
print("hello")
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
print("Moving item to itemsChecked...")
if let indexSection = indexSection, let indexRow = indexRow {
let item = self.sections[indexSection].items[indexRow]
// Item's properties variables
let itemID: String
let name: String
let uid: String
let isChecked: Bool
let checkedBy: String
let dateCreated: Date
let dateChecked: Date
let itemRef = self.db.collection(K.FStore.lists).document(self.currentListID!).collection(K.FStore.sections).document("\(indexSection)").collection(K.FStore.items).document(item.itemID!)
itemRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
// Get the properties of the item
let name = document.data()?[K.Item.name] as? String
let uid = document.data()?[K.Item.uid] as? String
let category = document.data()?[K.Item.categoryNumber] as? Int
let isChecked = document.data()?[K.Item.isChecked] as? Bool
let dateCreated = document.data()?[K.Item.date] as? Date
let dateChecked = document.data()?[K.Item.dateChecked] as? Date
let checkedBy = document.data()?[K.Item.checkedBy] as? String
var ref: DocumentReference? = nil
// Save the properties of the item in sectionsDeleted
ref = self.db.collection(K.lists).document(self.currentListID!).collection(K.FStore.sectionsChecked).document("\(category!)").collection(K.FStore.items).addDocument(data: [
K.Item.name: name,
K.Item.isChecked: isChecked,
K.Item.categoryNumber: category,
K.Item.date: dateCreated,
K.Item.dateChecked: dateChecked,
K.Item.checkedBy: checkedBy,
K.Item.uid: uid,
K.Item.dateDeleted: Date()
]) { err in
if let err = err {
print("Error adding document: \(err)")
} else {
// If successfull, delete the item in the normal collection
itemRef.delete() { err in
if let err = err {
print("Error removing document: \(err)")
} else {
print("Document successfully removed!")
}
}
}
}
} else {
print("Document does not exist")
}
}
self.tableView.reloadData()
} else {
itemRef.updateData([
K.Item.isChecked : false
]) { err in
if let err = err {
print("Error writing document: \(err)")
} else {
print("Document successfully written!")
}
}
}
} } } }
refreshTable()
}
有人可以帮助我解决此问题吗?
非常感谢, 马特
答案 0 :(得分:0)