ios - 在嵌入式 View Controller 中执行函数

标签 ios swift function uicontainerview

我有一个UIViewController。它有一个容器 View ,并在其中嵌入了一个 UITableViewController

enter image description here

表格 View 显示 20 个数字的数组。点击删除按钮会显示一个操作表,其中提供了两个选项来修改上述数组。

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
    }
}

我初始化 View Controller 并从 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)
    }

}

如何正确调用嵌入式 View Controller 中的函数?

演示项目已上传 here .

最佳答案

根据您的示例项目,这是一个解决方案:

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)
    }

}

您想要从 Storyboard中为您创建的segue 中获取tableViewControllerprepareForSegue:sender: 方法是一个点,您可以在其中将来自给定 viewController 的 Segue 挂接到另一个 View Controller (即使它嵌入 Segue)。检查上面的代码以获得有效的解决方案。

不要忘记为segue设置一个标识符(在我的例子中,我使用“embedSegue”,但请使用对您有意义的任何内容)。在您的情况下,这是没有必要的 - 您可以简单地测试 segue 是否转到 TableViewController 实例,但使用 segue 标识符是一个很好的做法 - 当项目变得更大时,它会得到返回。您可以通过单击segue(从ViewControllerTableViewController的箭头)在 Storyboard中设置它,并且在属性检查器的右侧面板上有一个标识符字段.

关于ios - 在嵌入式 View Controller 中执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102452/

相关文章:

ios - 如何从 iOS 中的格式化字符串中获取日期和时间

ios - 快速从文件中读取数据

ios - 拖动时删除 UITableView 和 UIRefreshControl 之间的空白

javascript - 为什么我的嵌套函数在 javascript 中未定义

c++ - 传递函数的缺点?

iphone - 将 NSManagedObject 子类转换为协议(protocol)

ios - 如何加速 iOS/Mac OS 的 Metal Code

ios - updatedTransactions(transactionState == .restored) 与 paymentQueueRestoreCompletedTransactionsFinished

ios - iOS开发-是否必须包括iPhone 4s?

java - 将 lambda 函数作为参数传递