我试图获取标头并仅更改View Controller的主体部分,因此我将Container View用作主体。 this is my storyboard 我没有使用委托方法从“ ViewController2”更新“ HomeViewController”标题的问题:
import UIKit
class HomeViewController: UIViewController {
// MARK: IBOutlets
@IBOutlet weak var headerTitleLabel: UILabel!
// MARk: Properties
// MARK: view life cycles
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nav = segue.destination as? UINavigationController,
let vc = nav.viewControllers.first as? ViewController2 {
vc.delegate = self
}
}
}
extension HomeViewController: ReceiveDataFromContainerViewDelegate {
func setHeader(title: String) {
self.headerTitleLabel.text = title
}
}
import UIKit
protocol ReceiveDataFromContainerViewDelegate: class {
func setHeader(title: String)
}
class ViewController2: UIViewController {
// MARK: Properties
weak var delegate: ReceiveDataFromContainerViewDelegate!
// MARK: View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
self.delegate.setHeader(title: "hello friend")
}
}
在“ ViewController2”上是“ Button1”,单击时显示“ ViewController3”,现在我不知道如何从ViewController3更新“ HomeViewController”标题,因此在这里我需要您的帮助。
我认为这不是做粘性标头的最佳方法,如果您有更好的主意,我也将不胜感激。
答案 0 :(得分:0)
好吧,您应该只需要将委托从VC2注入到VC3,也可以是类似的
class ViewController2: UIViewController {
// MARK: Properties
weak var delegate: ReceiveDataFromContainerViewDelegate!
// the function called when button 1 is pressed
func presentVC3() {
// I assuming your code doesn't look like this since you seem to be using
// storyboard segue's but the idea is the same
let vc3 = VC3()
vc3.delegate = self.delegate
...
}
}
class ViewController3: UIViewController {
// MARK: Properties
weak var delegate: ReceiveDataFromContainerViewDelegate!
但这感觉不对。
我不确定VC2如何“显示” VC3,但更好的主意是让VC2通过HomeViewController
中的新方法通知ReceiveDataFromContainerViewDelegate
,它应该替换容器视图中的视图控制器。 。 HomeViewController
在创建要放入容器视图的VC3时,可以使用与VC2相同的方式在VC3中设置委托。
或者,您也可以使用Notification Center来监听可以发送新标题的自定义通知。您可以在HomeViewController
上添加观察者,并在任何一个其他VC,但通常应尽可能避免使用Notification Center,因为它可能导致意外行为,并且很多Notification Center的代码变得难以使用和推理(通常是一个懒惰的解决方案,但是可以它的位置)。