2017-02-21 49 views
0

初學者在這裏,這是我使用委託的第一步,我很困惑 - 我試圖在兩個控制器之間傳遞數據,第一個控件是一個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) 
    } 

} 

進而調用saveProductController(的實現代碼如下):

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不符合協議。

我可以在這裏修改哪些內容以使用戶輸入的產品正確保存到核心數據?預先感謝任何幫助!

+0

請確保您的** AddProductController **看起來像這樣 - class AddProductController:UIViewController ProductSaveDelegate {},並且您必須在該類中實現協議方法,該方法是'func save(name:String,url:String,圖像:字符串)' –

回答

0

代表們真的很酷很強大,但有時候,他們可能會讓人困惑。您需要初始化ProductController中的代理,而不是AddProductController

這是一個偉大的形象,它顯示了一個委託和協議設置是如何工作的:

enter image description here

從安德魯·班克羅夫特的website

在這種情況下的圖像,你的代表是你的ProductController和您委託者是您的AddProductController

0

請確認您已訂閱了代表

不要忘記 -

classObject。委託=自

我想你已經熟悉的代表,

你得到這個錯誤,因爲,無論你從AddProductControllernot implemented the delegate method(在你的情況是假的,因爲我可以看到它實現的),或者你忘了認購委託,這樣做,你需要確保 -

  1. 訂閱委託,即過渡到下一個控制器集前授人以自己喜歡 -

也在同一類需要實現在協議中定義的方法,即func save(name: String, url: String, image: String)你的情況(已經實現)

您還可以檢查一個small demo,我在這裏爲協議實現。