如何从另一个NavigationController

时间:2017-07-03 05:51:52

标签: swift uinavigationcontroller uinavigationbar

我有一个SideMenuController(https://github.com/dogo/AKSideMenu),可以处理三个NavigationViewControllers:

  • 一个名为ContentVC的中心
  • 双方都是
    • leftMenuVC更改了ContentVC
    • rightFilterVC,用于过滤内容。

Scheme

当用户按下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发生了变化,他们会更新自己吗?还是有另一种方法吗?

1 个答案:

答案 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")