navigationController中有2个viewControllers:navigationController-> root-> A 在viewController A中,如果用户进行了一些设置并按下左侧栏按钮项(返回),我希望根视图更新其布局(某些视图的大小将被更改)。
到目前为止,我通过在两个viewControllers之间添加一个navigationController(模态地呈现)来实现它:navigationController-> root-> navigationController-> A.
有没有办法用一个navigationController更新根viewController?(截图1)
感谢。
-----编辑-----
示例代码:
override func viewWillAppear(_ animated: Bool) {
creatButtons()
}
func createButtons(){
let button1 = UIButton()
........
let button2 = UIButton()
........
.......
}
如果我在viewWillAppear()下创建了16个按钮,那么从A回来时是否会复制所有按钮?它们的大小都需要更新。
答案 0 :(得分:3)
不确定我是否正确理解了您的问题,但以下是如何处理此方案的两种选择:
如果要在root
中更改设置时刷新A
的视图层次结构,请确保将更改保留在同时root
和A
的位置可以访问。覆盖-viewWillAppear:
中的root
(将在"后退"也会触发)方法,并且每次都根据设置布局视图。
其他选择:
您可以为delegate protocol
创建由A
实施的root
,并将root
指定为A
' s delegate
当root
实例化或呈现A
时。
A
然后会调用其委托(root
)来通知它有关更改并让root
更新其观看次数。
答案 1 :(得分:0)
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)
}
}