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?()
}
}
我有 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?()
}
}