2017-02-13 51 views
0

我試圖解除模態視圖並返回到「發送」的視圖控制器,同時保留在模態視圖中輸入的數據。如果我理解正確,我需要爲此使用委託人/協議,但是在這種情況下,我很難理解如何實際執行它。解除模態視圖但保留數據

基本上是一個用戶可以調用模態的視圖,進入文本字段的一些信息,而當他們點擊保存這個函數被調用:

func handleSave() { 

    guard let newProductUrl = NSURL(string: 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 
    } 

    // Call save function in view controller to save new product to core data 
    self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage) 


    // Present reloaded view controller with new product added 
    let cc = UINavigationController() 
    let pController = ProductController() 
    productController = pController 
    cc.viewControllers = [pController] 
    present(cc, animated: true, completion: nil) 
} 

它調用self.productController?.save功能的新輸入的值保存到核心數據,並用新產品重新加載productController表格視圖。

但是我遇到的問題是productController表視圖是根據其他因素動態設置的,所以我只想在用戶輸入數據後關閉模態視圖並返回到頁面模態視圖被調用。

編輯:嘗試在理解如何實現委託 -

ProductController的是,用戶得到的模態視圖從父類:

protocol ProductControllerDelegate: class { 
func getData(sender: ProductController) 
} 


class ProductController: UITableViewController, NSFetchedResultsControllerDelegate, WKNavigationDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    weak var delegate:ProductControllerDelegate? 

} 

    func getData(sender: ProductController) { 

} 

而且AddProductController是模態呈現控制器,其中用戶輸入數據然後handleSave被調用,我想解僱並返回到ProductController的tableview,它被稱爲:

class AddProductController: UIViewController, ProductControllerDelegate { 

override func viewDidDisappear(_ animated: Bool) { 
    // error on this line 
    getData(sender: productController) 
} 

回答

0

基本上你需要在這個模態視圖中創建一個委託。 假設您有創建此模態視圖控制器的ParentViewController。 ParentViewController必須實現委託方法,比方說retrieveData(someData)。

在模態視圖控制器,你可以使用的方法viewWillDisappear()觸發你想傳遞給家長該數據的委託方法:

delegate.retrieveData(someData)

如果您在理解如何實現代理時遇到問題,您可以檢查this link

+0

謝謝瓊我現在正在嘗試 - 我應該在父視圖控制器(ProductController)或模式控制器(AddProductController)中創建協議? – d0xi45

+0

我想將'handleSave'中收集的數據傳遞給父級(ProductController),我可以傳遞一個完整的函數嗎?我的印象是'handleSave'將用戶輸入的數據傳遞到核心數據,然後ProductController正在從核心數據讀取 – d0xi45

+0

@ d0xi45您必須在AddProductController中聲明協議,但在ProductController中實現它,請檢查我之前發佈的鏈接。我不知道你的意思是傳遞一個完整的函數,它的工作方式是調用其他函數。 –

1

如果協議的唯一目的是返回視圖控制器的最終狀態,盟友更容易和更清晰地使用unwind segue而不是協議。

步驟:

1)在母體VC你做出@IBAction退繞(賽格瑞:UIStoryboardSegue)方法

2)在所提出的視圖控制器的故事板可以控制從任一所需的控制拖觸發退出或從黃色視圖控制器本身(如果在代碼中執行繼續)到橙色退出圖標。

你的代碼應該是這樣的:在這裏

@IBAction func unwind(segue: UIStoryboardSegue) { 
     if let source = segue.source as? MyModalViewController { 
      mydata = source.data 
      source.dismiss(animated: true, completion: nil) 
     } 
    } 

see apple documentation

編輯是觸發和代碼不放鬆故事板哈克的方式;我不認同這樣做:

 guard let navigationController = navigationController, 
      let presenter = navigationController.viewControllers[navigationController.viewControllers.count - 2] as? MyParentViewController else { 
      return 
     } 
     presenter.unwind(UIStoryboardSegue(identifier: String(describing: self), source: self, destination: presenter)) 
+0

這是唯一的目的,所以我會嘗試這種方式,而不是代表現在,出於某種原因,我發現代表們真的很困惑,因爲這個任務看起來很簡單..雖然我沒有使用故事板,但這是所有程序化。 – d0xi45

+0

你只能用故事板做到這一點。否則,你必須使用hackery。也就是說,您需要對視圖控制器的引用,或者從navigationController中抓取它。看代碼編輯 –

+0

我認爲它可能在Swift 3中有點不同,當我嘗試hackery方法時,它想要一個'towardsViewController'參數。我嘗試將代碼插入正確的語法中,例如'presenter.unwind(for:UIStoryboardSegue(identifier:String(describe:self),source:self,destination:presenter),但是遇到了崩潰 – d0xi45