初學者在這裏,這是我使用委託的第一步,我很困惑 - 我試圖在兩個控制器之間傳遞數據,第一個控件是一個tableview顯示一些產品,另一種是模式化的視圖,它允許用戶輸入一個新的產品在該桌面視圖上顯示。當用戶在模式視圖中點擊「保存」時,我想將新產品保存到核心數據中並將其顯示在桌面視圖中。使用代理將值保存到核心數據
用戶輸入的信息在三個文本字段AddProductController
(模式視圖),然後點擊保存它調用handleSave
:
func handleSave() {
guard let newProductUrl = self.urlTextField.text else {
print("error getting text from product url field")
return
}
guard let newProductName = self.nameTextField.text else {
print("error getting text from product name field")
return
}
guard let newProductImage = self.logoTextField.text else {
print("error getting text from product logo field")
return
}
DispatchQueue.main.async {
self.productSaveDelegate?.save(name: newProductName, url: newProductUrl, image: newProductImage)
let companyController = CompanyController()
self.navigationController?.pushViewController(companyController, animated: true)
}
}
進而調用save
在ProductController
(的實現代碼如下):
func save(name: String, url: String, image: String) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let entity =
NSEntityDescription.entity(forEntityName: "Product",
in: managedContext)!
let product = NSManagedObject(entity: entity,
insertInto: managedContext)
product.setValue(name, forKey: "name")
product.setValue(url, forKey: "url")
product.setValue(image, forKey: "image")
do {
try managedContext.save()
products.append(product)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
tableView.reloadData()
}
如果我的理解正確,我使用代理作爲兩者之間的一種鏈接,以便我可以將用戶輸入的值直接傳遞到我的函數save
函數N +糾正我,如果我錯了我很新。但是我創建在ProductController
(所述的tableview控制器)頂部的類範圍外的代表像這樣:
protocol ProductSaveDelegate {
func save(name: String, url: String, image: String)
}
然後在AddProductController
(其中用戶輸入了新產品信息模態視圖)我初始化附近的代表在類的頂部:
var productSaveDelegate: ProductSaveDelegate?
,然後用它來調用save
功能handleSave()
由上述可見。
當我嘗試將ProductSaveDelegate
添加到AddProductController
的類定義時,出現錯誤,說明AddProductController
不符合協議。
我可以在這裏修改哪些內容以使用戶輸入的產品正確保存到核心數據?預先感謝任何幫助!
請確保您的** AddProductController **看起來像這樣 - class AddProductController:UIViewController ProductSaveDelegate {},並且您必須在該類中實現協議方法,該方法是'func save(name:String,url:String,圖像:字符串)' –