Вызов функции от ребенка к родителю в Swift
Я использую xlpagertabstrip, и у меня есть родительский контроллер представления, который имеет двух детей (child1, child2).
В моем родительском контроллере представления я показываю UIActivityViewIndicator, но я хочу знать, как скрыть этот индикатор в моем child1.
Это мой код:
ParentViewController:
override func viewDidLoad() {
showActivityIndicator()
super.viewDidLoad()
}
func showActivityIndicator() {
//code related to titleview
navigationItem.titleView = titleView
}
func hideActivityIndicator() {
navigationItem.titleView = nil
}
Child1ViewController:
override func viewDidLoad() {
super.viewDidLoad()
call_api()
}
func call_api(){
//code related to api
//if api is ok, I call hideActivityIndicator()
let pctrl = ParentViewController()
pctrl.hideActivityIndicator()
}
Но этот код не работает. Как я могу решить это?
2 ответа
Как насчет наличия ChildViewControllerDelegate? Что-то вроде:
classParentViewController {
func someFunc(){
...
childVC.delegate = self
...
}
}
extension ParentViewController: ChildViewControllerDelegate {
func childViewControllerDidFinishApiCall() {
hideActivityIndicator()
}
}
protocol ChildViewControllerDelegate: class {
func childViewControllerDidFinishApiCall()
}
class ChildViewController {
weak var delegate: ChildViewControllerDelegate?
func call_api(){
//code related to api
let pctrl = ParentViewController()
delegate?.childViewControllerDidFinishApiCall()
}
}
Просто пройдите hideActivityIndicator()
от родителя к ребенку и звоните по необходимости. Поэтому, когда вы создаете свой дочерний контроллер, делайте так:
// Parent Controller
childVC.someMethodFromParent = hideActivityIndicator
И в вашем ChildController сделайте это:
// Child Controller
internal var someProperty: (() -> Void)!
override func viewDidLoad() {
super.viewDidLoad()
call_api()
}
func call_api(){
//code related to api
//if api is ok, I call hideActivityIndicator()
someMethodFromParent()
}
Это должно работать