Swift,从容器中获取操作栏按钮操作

Swift, Get action Bar Button Action from Container

我有 ParentViewController.swift 和 ChildContainer.swift。 在 ParentViewController 中,我有如下所示的条形按钮项目操作:

@IBAction func onClickBarItemRefresh(_ sender: UIBarButtonItem) {
    print("Refresh")
}

我想知道如何从 ChildContainer call/get 这个动作? 我可以用 parent?.navigationItem.title = "YourName" 更改标题,但我找不到有关获取操作的相关问题。

附加信息: 我在 1 个 ParentViewController 中有 4 或 5 个容器,所以所有逻辑都在它们的容器上。所以我需要在 4 或 5 child 容器上调用操作,在操作

中使用不同的登录名

首先在ContainerViewController中声明一个回调函数。

var refreshButtonTapped: (() -> Void)?

ParentViewController 中初始化 ContainerViewController 给出回调函数的动作。

在你的情况下,创建一个单独的方法,即 refreshContent() 并从 onClickBarItemRefresh() 方法以及你初始化 ContainerViewController.[=25= 的 refreshButtonTapped 函数中调用它]

class ParentViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(onClickBarItemRefresh(_:)))
        
        showContainerVC()
    }
    
    @objc func onClickBarItemRefresh(_ sender: UIBarButtonItem) {
        refreshContent()
    }
    
    private func refreshContent() {
        print("Refresh Content")
    }
    
    func showContainerVC() {
        let vc = ContainerViewController()
        // call refreshContent() inside the callback function
        vc.refreshButtonTapped = { [weak self] in
            self?.refreshContent()
        }
        let nav = UINavigationController(rootViewController: vc)
        self.addChild(nav)
        nav.view.frame = CGRect(x: 20, y: 100, width: 320, height: 200)
        self.view.addSubview(nav.view)
        nav.didMove(toParent: self)
    }
}

ContainerViewController 中你想执行 refreshContent() 的操作只需调用回调函数 refreshButtonTapped 如下。例如,我从 viewDidAppear() 方法调用它。它将在ParentViewController.

执行刷新动作
class ContainerViewController: UIViewController {
    
    var refreshButtonTapped: (() -> Void)?
    
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .yellow
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print(#function)
        // call this where you want to perform refreshing of ParentViewController
        refreshButtonTapped?()
    }
}