问题
There are 2 viewControllers in a navigationController: navigationController->root->A In viewController A, if a user make some settings and press the left bar button item(Back), I want the root view to renew its layout(some views' size will be changed).
By now, I make it works by adding one more navigationController between the two viewControllers(present modally): navigationController->root->navigationController->A.
Is there a way to renew the root viewController with one navigationController?(Screenshot 1)
Thanks.
----- Edited -----
Sample codes:
override func viewWillAppear(_ animated: Bool) {
creatButtons()
}
func createButtons(){
let button1 = UIButton()
........
let button2 = UIButton()
........
.......
}
If I create 16 buttons under viewWillAppear(), will all the buttons be duplicated when comes back from A? Their size are all need to be renewed.
回答1:
Not sure if I understood your question correctly but here are two alternatives on how to handle this scenario:
If you want to refresh the view hierarchy of root
when settings are changed in A
just make sure to persist the changes in a place that both root
and A
can access. Override the -viewWillAppear:
(will be triggered on "back" as well) method in root
and layout the view according to the settings every time.
Other alternative:
You could create a delegate protocol
for A
that is implemented by root
and assign root
as A
's delegate
when root
instantiates or presents A
.
A
would then invoke its delegate (root
) to inform it about the change and let root
update its views.
回答2:
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 - You can read as A view Controller
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)
}
}
来源:https://stackoverflow.com/questions/42024192/how-to-reload-rootviewcontroller-in-navigationcontroller-when-press-back