如何在navigationController中重新加载rootViewController当按“返回”?

navigationController中有2个viewController:navigationController-> root-> A 在这里输入图像说明 在viewController A中,如果用户进行一些设置,然后按左边的条形button项(Back),我想让根视图更新它的布局(有些视图的大小会改变)。

现在,我通过在两个viewControllers之间添加一个navigationController(模态地)来实现它:navigationController-> root-> navigationController-> A。 在这里输入图像说明

有没有办法用一个navigationController更新根viewController?(截图1)

谢谢。

—–编辑—–

示例代码:

override func viewWillAppear(_ animated: Bool) { creatButtons() } func createButtons(){ let button1 = UIButton() ........ let button2 = UIButton() ........ ....... } 

如果我在viewWillAppear()下面创build了16个button,那么从A返回时所有的button是否都会被复制? 他们的大小都需要更新。

不知道如果我正确理解您的问题,但是有两种方法可以处理这种情况:

如果要在A中更改设置时更新root的视图层次结构,请确保将更改保存在rootA可以访问的位置。 覆盖-viewWillAppear:会在“后退”方法中触发)方法并根据设置每次布置视图。

其他select:

您可以创build一个由root实现的Adelegate protocol ,并在root实例化或呈现A时将root指派为Adelegate

然后, A会调用它的委托( root )来通知它的变化,并让它更新它的视图。

RootViewController的

 class RootViewController: UIViewController ,ProtocolDemo{ @IBOutlet weak var IBbtnHeight: NSLayoutConstraint! @IBOutlet weak var IBbtnWidth: NSLayoutConstraint! @IBAction func btnNextTapped(sender: AnyObject) { let sec = SecondVC(nibName: "SecondVC", bundle: nil) sec.delegate = self self.navigationController?.pushViewController(sec, animated: true) } //Mark:- ProtocolDemo Delegate Method func displayMethod(width : Int , height : Int) { self.IBbtnHeight.constant = CGFloat(height) self.IBbtnWidth.constant = CGFloat(width) print("Protocol Calling here") } } 

SecondVC – 您可以阅读为视图控制器

 protocol ProtocolDemo { func displayMethod(width : Int , height : Int)//PassYouWantToChange //Here you can send full frame if change to update } class SecondVC: UIViewController { var delegate : ProtocolDemo? @IBAction func btnBackTapped(sender: AnyObject) { delegate?.displayMethod(160, height: 160) //Calling Delegate method //pass your data you want to implement self.navigationController?.popViewControllerAnimated(true) } }