FABMenuController 跨视图控制器共享 FAB

FABMenuController to share FAB across view controllers

我正在关注 CardTableView 演示代码及其嵌入视图控制器的方式,以便 FABMenuController 位于顶部。出于某种原因,以下代码有效,直到我尝试添加 FABController:

let tabs = AppPageTabBarController(viewControllers:[InvitedViewController(), CoordinatingViewController(), PastViewController()])
let toolbar = AppToolbarController(rootViewController: tabs)
let root = MyTeeUpsViewController(rootViewController: toolbar, leftViewController: NavDrawerContainerController())
let snackBarController = AppSnackbarController(rootViewController: root)
let fabMenuController = AppFABMenuController(rootViewController: snackBarController)
self.present(fabMenuController, animated: true)

我已经像演示代码一样实现了 AppFABMenuController,它存在,并且继承自 MaterialSwift 的 FABMenuController。我不明白为什么会出现错误:fatal error: unexpectedly found nil while unwrapping an Optional value 关于视图层次结构,我认为最后嵌入 SnackbarController 更有意义,但即使我这样做,它仍然在声明 let fabMenuController=...

的行上失败

我会像这样处理您的设置:

let tabs = AppPageTabBarController(viewControllers:[InvitedViewController(), CoordinatingViewController(), PastViewController()])
let toolbar = AppToolbarController(rootViewController: tabs)
let fabMenuController = AppFABMenuController(rootViewController: toolbar)
let snackBarController = AppSnackbarController(rootViewController: fabMenuController)
let navDrawer = MyTeeUpsViewController(rootViewController: snackBarController, leftViewController: NavDrawerContainerController())
self.present(navDrawer, animated: true)

基本上,NavigationDrawerController 应该始终是最低级别,或者视图堆栈的根。如果您要通过登录进行设置,则可以将 NavigationDrawerController 设置为您的 AppDelegates rootViewController,并禁用侧面板。当用户成功登录时,您可以调用 navigationDrawerController?.transition(to: MyNewVC) 然后启用侧面板。这样登录视图控制器就脱离了堆栈,一切都设置好了。我将 ToolbarController 作为 FABMenuController 的子级放置,以便您可以在控制器之间切换并添加一个全新的顶部导航控制器或完全删除它。当显示 FABMenu 时,Material 的外观通常会覆盖屏幕上的所有内容。 Snackbar 可以高于或低于 FABMenu,但这真的取决于您,在视觉上,它永远不会产生影响。

请注意,在最新的 Material 2.9.* 中,您不再需要转换 rootViewController 类型,也不再需要在子视图控制器中仅搜索转换控制器。意思是,您现在可以从任何地方调用 toolbarController?.transition ... 等

希望这对您有所帮助:)