How to reload rootViewController in navigationController When press “back”?

泪湿孤枕 提交于 2020-01-07 02:31:07

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!