2017-07-03 22 views
0

改变我有处理三种NavigationViewControllers一个SideMenuController(https://github.com/dogo/AKSideMenu):如何在UINavigationBar的标题从另一个NavigationController

  • 之一的中心名为ContentVC
  • 两个sideMenus
    • leftMenuVC从而改变ContentVC
    • rightFilterVC用于过滤内容。

Scheme

当用户按下rightFilterVC项目, 的ContentVC内容应该是 “刷新” - 不是在控制器本身。(NavigationBar中的标题,以及它自己的内容)。 ContentVC类应该保持不变。

我可以从rightFilterMenu重新实例化ContentVC,但是然后rightFilterMenu负责实例化ContentVC。这应该是leftMenuVC的一部分。只有左菜单才能更改ContentVC。 rightFilterVC通常用于更改Filter类中的静态变量。 Filter类可以从每个ViewController访问,并保存用于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改变了?还是有另一种方法?

回答

1

你的逻辑ins't工作,因为你实例化一个新的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") 
+0

我是否必须对“rightFilterVC”做第二个委托? rightFilterVC不知道哪个控制器在中心!我必须告诉他。我真正的“setNavBarTitle”-func有两个参数,一个用于“ControllerNameTitle”,一个用于“FilterName(Subline)”。据我了解,你的例子(谢谢!)期望双方都设置ContentVC和标题。我也有'SideMenuController'(willHide,willShow,didHide,willHide)的委托。也许我可以使用它们而不是创建你的?我也可能需要创建一个委托来传递ControllerName给它。 – Jan

相关问题