Я создаю простое приложение To-Do List, используя CloudKit в качестве базы данных.В настоящее время я могу добавлять и удалять объекты, но я не согласен с редактированием объекта.
EditItemController
protocol EditItemControllerDelegate {
func editItemController(_ controller: EditItemController, didFinishEditing item: ItemCK)
}
class EditItemController: UIViewController {
var delegate: EditItemControllerDelegate?
var itemToEdit: ItemCK?
let itemTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Hello"
return textField
}()
@objc func handleSave() {
if let item = itemToEdit {
guard let itemName = self.itemTextField.text else { return }
item.name = itemName
delegate?.editItemController(self, didFinishEditing: item)
}
}
ItemController
class ItemController: UITableViewController, UITextFieldDelegate, EditItemControllerDelegate {
func editItemController(_ controller: EditItemController, didFinishEditing item: ItemCK) {
if let index = itemsModel.items.index(of: item) {
let indexPath = IndexPath(row: index, section: 0)
if let cell = tableView.cellForRow(at: indexPath) as? ItemCell {
cell.itemLabel.text = item.name
print(item.name)
}
}
}
Таким образом, когда я редактирую объект, ячейка табличного представления перезагружается с новыми данными объекта.но когда я провожу назад, он возвращается к исходному объекту.Кажется, не хранится в базе данных.Как мне отредактировать объект, сохранить его, а затем представить его в ячейке табличного представления?
CloudKit Code
class ItemCK: NSObject {
static let recordType = "Item"
static let keys = (name: "title")
var record: CKRecord
init(record: CKRecord) {
self.record = record
}
override init() {
record = CKRecord(recordType: ItemCK.recordType)
}
var name: String {
get {
return record.value(forKey: ItemCK.keys.name) as! String
}
set {
record.setValue(newValue, forKey: ItemCK.keys.name)
}
}
}
class ItemModel {
private let database = CKContainer.default().privateCloudDatabase
var items = [ItemCK]() {
didSet {
self.notificationQueue.addOperation {
self.onChange?()
}
}
}
var onChange: (() -> Void)?
var onError : ((Error) -> Void)?
var notificationQueue = OperationQueue.main
var records = [CKRecord]()
var insertedObjects = [ItemCK]()
var editedObjects = ItemCK()
//to keep track of deleted objects
var deletedCKObjectIds = Set<CKRecord.ID>()
init() {
}
func addCategory(name: String) {
print("Adding item")
let item = ItemCK()
item.name = name
database.save(item.record) { (_, error) in
guard error == nil else {
self.handle(error: error!)
return
}
}
insertedObjects.append(item)
updateItem()
}
func editItem() {
let privateDatabase = database
var predicate= NSPredicate
}
func delete(at index: Int) {
print("Deleting item")
let recordId = self.items[index].record.recordID
database.delete(withRecordID: recordId) { (_, error) in
guard error == nil else {
self.handle(error: error!)
return
}
}
deletedCKObjectIds.insert(recordId)
updateItem()
}
@objc func refresh() {
print("refreshing")
let query = CKQuery(recordType: ItemCK.recordType, predicate: NSPredicate(value: true))
database.perform(query, inZoneWith: nil) { (records, error) in
guard let records = records, error == nil else {
self.handle(error: error!)
return
}
self.records = records
self.updateItem()
}
}
private func updateItem() {
print("Updating item")
var knownIds = Set(records.map {$0.recordID})
self.insertedObjects.removeAll { (item) -> Bool in
knownIds.contains(item.record.recordID)
}
knownIds.formUnion(insertedObjects.map {$0.record.recordID})
self.deletedCKObjectIds.formIntersection(knownIds)
var items = records.map { (record) in ItemCK(record: record) }
items.append(contentsOf: insertedObjects)
items.removeAll { (items) -> Bool in
deletedCKObjectIds.contains(items.record.recordID)
}
self.items = items
}
}
Извините за длинный исходный код.CloudKit настолько сбивает с толку, IDK, какой информацией важно поделиться или нет