2017-09-07 85 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

相关问题