我有一个SideMenuController(https://github.com/dogo/AKSideMenu),可以处理三个NavigationViewControllers:
当用户按下rightFilterVC上的项目时, ContentVC内容应该"刷新" - 不是控制器本身。(NavigationBar中的标题,以及它自己的内容)。 ContentVC类应该保持不变。
我可以从rightFilterMenu重新安装ContentVC,但是rightFilterMenu负责实现ContentVC。这应该是leftMenuVC的一部分。只有leftMenuVC应该能够更改ContentVCs。 rightFilterVC通常用于更改Filter类中的静态变量。可以从每个ViewController访问Filter类,并保存用于api调用的参数。
// Typical rightFilterMenu change looks like this:
Filter.name = self.selectedName
// can do that in rightFilterVC
// but should only be part of leftMenuVC
self.sideMenu.contentViewController = self.storyboard!.instantiateViewController(withIdentifier: "ContentVC1")
// something like this does not work either
self.sideMenu.contentViewController.customNavBar.setTitle(self.filter.name)
self.sideMenu.contentViewController.setNeedsLayout()
self.sideMenu.contentViewController.setNeedsDisplay()
我应该在每个ContentController中实现" Filter" -observer吗?如果rightMenuVC发生了变化,他们会更新自己吗?还是有另一种方法吗?
答案 0 :(得分:1)
您的逻辑无法正常工作,因为您正在实例化一个新VC,与屏幕上的VC不同:
self.sideMenu.contentViewController = self.storyboard!.instantiateViewController(withIdentifier: "ContentVC1")
您可能可以使用委托来解决此问题。
1 - 使用" updateNavigationTitle"创建委托协议。内部功能:
protocol SideMenuDelegate {
func updateNavigationTitle(_ newName : String)
}
2 - 将ContentVC设置为SideMenuDelegate:
class ContentVC : SideMenuDelegate ... {
func updateNavigationTitle(_ newName: String) {
self.customNavBar.setTitle(newName)
}
}
3 - 在您的侧面菜单控制器上,将代理添加为属性:
var delegate: SideMenuDelegate?
4 - 当您调用侧边菜单时,设置委托(可能在viewDidLoad函数上):
self.delegate = ContentVC
(获取当前ContentVC的引用,不要实例化新的ContentVC)
5 - 最后,从其中一个侧边菜单中:
self.delegate.updateNavigationTitle("My new Content VC navigation Title")