【问题标题】:How to reload rootViewController in navigationController When press "back"?当按“返回”时,如何在 navigationController 中重新加载 rootViewController?
【发布时间】:2017-06-20 19:43:07
【问题描述】:

一个navigationController中有2个viewController:navigationController->root->A 在 viewController A 中,如果用户进行一些设置并按下左栏按钮项(返回),我希望根视图更新其布局(某些视图的大小将更改)。

现在,我通过在两个视图控制器之间添加一个导航控制器(以模态方式存在)来使其工作:navigationController->root->navigationController->A。

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

谢谢。

----- 已编辑 -----

示例代码:

override func viewWillAppear(_ animated: Bool) {

    creatButtons()

}

func createButtons(){

    let button1 = UIButton()
    ........
    let button2 = UIButton()
    ........
    .......

}

如果我在 viewWillAppear() 下创建 16 个按钮,当从 A 回来时,所有按钮都会被复制吗?它们的大小都需要更新。

【问题讨论】:

  • 请您分享您真正想要的代码
  • “用一个navigationController更新根viewController”是什么意思
  • @NiravD 我上传了两张截图,可能会更清晰。
  • 是的,每次都创建新按钮,因为每次返回屏幕时都会调用 viewWillAppear

标签: ios swift uinavigationcontroller reload


【解决方案1】:

不确定我是否正确理解了您的问题,但这里有两种关于如何处理这种情况的选择:

如果您想在A 中更改设置时刷新root 的视图层次结构,只需确保将更改保留在rootA 都可以访问的位置。覆盖root 中的-viewWillAppear:(也将在“返回”时触发)方法,并每次根据设置布局视图。

其他选择:

您可以为由root 实现的A 创建一个delegate protocol,并在root 实例化或呈现A 时将root 分配为Adelegate

A 然后会调用它的委托 (root) 来通知它有关更改并让 root 更新它的视图。

【讨论】:

  • 在 viewWillAppear 中这样做是个好主意,但您的意思是更新大小还是重新绘制整个布局?如果重绘整个布局,会不会重复布局?如果只是更新大小,它有很多工作要做,因为它有 16 个按钮需要调整大小。
  • 我建议在 -viewDidLoad 创建视图控制器时创建所有按钮,并从 -viewWillAppear: 设置它们的大小和外观。这样你就可以在每次显示视图控制器之前刷新按钮框架和外观。
【解决方案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 - 你可以读作 A 视图控制器

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)
    }
}

【讨论】:

  • 我已经编辑了我的问题并添加了两个屏幕截图,只是想知道布局是否会创建两次?
  • @jdleung ,请参阅我也更新了我的答案。您需要设置约束 IBOutlet 并返回到视图控制器以更新它们
  • 感谢您的建议!我毫不怀疑它可以通过协议工作。但是你知道视图有 16 个按钮,我必须写更多的代码。重新加载整个视图是最好的方式,现在我认为第二张截图中的方式是更好的选择。
  • 您是否以编程方式创建 16 个按钮?当你重新加载你的视图时如何识别你的按钮大小被修改了?
  • 根据您的示例代码,当您重新加载视图时(称为 viewWillAppear),然后再次在视图中添加 16 个新按钮。我认为委托是唯一的最佳选择
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多