2017-09-07 83 views
1

我有一個UIViewController。它有一個容器視圖,其中嵌入了一個UITableViewController在嵌入式視圖控制器中執行功能

enter image description here

表視圖顯示20個數字的陣列。點擊刪除按鈕顯示一個操作表,它提供了2個選項來修改上述數組。

enter image description here

我有內部UITableViewController兩個函數來修改該數組。

class TableViewController: UITableViewController { 

    fileprivate var values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func deleteFirstTen() { 
     values.removeSubrange(values.startIndex..<values.startIndex.advanced(by: 10)) 
     tableView.reloadData() 
    } 

    func deleteLastTen() { 
     values.removeSubrange(values.startIndex.advanced(by: 10)..<values.endIndex) 
     tableView.reloadData() 
    } 

    // MARK: - Table view data source 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return values.count 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
     cell.textLabel?.text = "\(values[indexPath.row])" 
     return cell 
    } 
} 

我初始化視圖控制器並從UIViewController調用這些函數,但它沒有做任何事情。

class ViewController: UIViewController { 

    @IBAction func didTapDeleteButton(_ sender: UIBarButtonItem) { 
     let tableViewController = storyboard?.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController 

     let sheet = UIAlertController(title: nil, message: "Do You Want to Delete...", preferredStyle: .actionSheet) 
     sheet.addAction(UIAlertAction(title: "1 - 10", style: .default) { action in 
      tableViewController.deleteFirstTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "11 - 20", style: .default) { action in 
      tableViewController.deleteLastTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     present(sheet, animated: true, completion: nil) 
    } 

} 

如何正確調用嵌入式視圖控制器中的函數?

Demo project uploaded here

+0

是否真的有必要嵌入UITableViewController?爲什麼你不簡單地在你的ViewController上添加UITableView和他的委託? –

+0

@GiuseppeSapienza這是我的實際需求的簡化版本。在真正的應用程序中,我必須在同一個視圖控制器中顯示錶視圖和集合視圖。所以我必須使用容器視圖。 – Isuru

+0

如果您不需要使用參數調用函數,那麼您可以使用'NotificationCenter'並在您的tableviewcontroller內部添加一個觀察器,然後在您的viewcontroller中嵌入該視圖控制器將其發佈到您每次觀察的名稱didTapDeleteButton被調用。否則,如果您確實需要傳遞參數,我會在您的viewcontroller中存儲一個引用tableviewcontroller內部方法的閉包,並在需要時調用該閉包。 – TNguyen

回答

2

根據您的樣本項目,這是一個解決方案:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    var tableViewController: TableViewController? = nil 

    // this method is a point in which you can hook onto segues 
    // coming from this viewController and do anything you want to 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // if it's a segue going to TableViewController and it has 
     // the identifier we set in the storyboard, then this is the 
     // tableViewController we want to get 
     if segue.identifier == "embedSegue", 
      let vc = segue.destination as? TableViewController { 
      self.tableViewController = vc 
     } 
    } 

    @IBAction func didTapDeleteButton(_ sender: UIBarButtonItem) { 

     let sheet = UIAlertController(title: nil, message: "Do You Want to Delete...", preferredStyle: .actionSheet) 
     sheet.addAction(UIAlertAction(title: "1 - 10", style: .default) { action in 
      self.tableViewController?.deleteFirstTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "11 - 20", style: .default) { action in 
      self.tableViewController?.deleteLastTen() 
     }) 
     sheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) 
     present(sheet, animated: true, completion: nil) 
    } 

} 

你想從分鏡腳本爲您創建的SEGUE的tableViewControllerprepareForSegue:sender:方法是一個點,您可以在該點中將來自給定viewController的segue鉤到另一個(即使嵌入了segue時)。檢查上述代碼的工作解決方案。

不要忘記爲segue設置一個標識符(在我的情況下,我使用"embedSegue",但使用任何有意義的東西)。在你的情況下,這是沒有必要的 - 你可以簡單地測試segue是否到達TableViewController實例,但是使用segue標識符是一個很好的做法 - 當項目變大時它會得到回報。您可以通過單擊segue(從ViewControllerTableViewController的箭頭)並在Attributes Inspector的右側面板中單擊標識符來設置它。

+0

完美!謝謝。 – Isuru

相關問題