【发布时间】:2018-08-22 11:45:05
【问题描述】:
我正在尝试在整个应用程序中实现明暗主题。我的问题是它不能正常工作。我有一个 ContainerVC,其中包含 2 个 ContainerViews - SidebarMenuVC 和 DashboardVC。 SidebarMenuVC 是偏移量,因此最初显示的是用户 DashboardVC。
ContainerVC 嵌入在UINavigationController 中,并且有一个汉堡式菜单。当用户点击该菜单按钮时,将显示SidebarMenuVC。这一切都很好。
SidebarMenuVC 包含负责更改应用主题的图像。当用户点击图像时,它会从亮变为暗,反之亦然。点击的那一刻改变了SidebarMenuVC 的主题,但是当你隐藏菜单(通过滑动)时,DashboardVC 的主题没有被应用。我尝试使用protocol 来做到这一点,但我认为我做得不对(好吧,它不起作用,所以我知道我搞砸了)。
protocol ReloadTheme {
func reload()
}
class ContainerVC: UIViewController, SidebarDelegate {
var delegateReloadTheme: ReloadTheme?
func hideMenu() {
sideBarMenuLeadingConstraint.constant = -300
applyTheme()
animateConstraint()
delegateReloadTheme?.reload() // when I put a breakpoint here, it shows it's nil
}
}
extension DashboardVC : ReloadTheme {
func reload() {
applyTheme()
}
}
所以,大局是:当用户向右滑动到hideMenu()(在ContainerVC中,它需要访问DashboardVC并调用applyTheme()
协议/代表总是让我感到困惑,因此欢迎提供一点帮助。
好的,按照要求,sidebarMenu 的连接方式如下:
protocol SideBarDelegate: class {
func showMenu()
func hideMenu()
}
class DashboardVC: UIViewController {
static weak var delegateSideBar: SideBarDelegate?
@IBAction func sideMenuButtonPressed(_ sender: UIBarButtonItem) {
Dashboard.delegateSideBar?.showMenu()
}
}
然后在ContainerVC:
class ContainerVC: UIViewController, SideBarDelegate {
override func viewDidLoad() {
super.viewDidLoad()
DashboardVC.delegateSideBar = self
}
func hideMenu() {
sideBarMenuLeadingConstraint.constant = -300
dimView.isHidden = true
applyTheme()
animateConstraint()
// delegateReloadTheme?.reloadTheme()
}
func showMenu() {
sideBarMenuLeadingConstraint.constant = 0
dimView.isHidden = false
applyTheme()
animateConstraint()
}
func animateConstraint() {
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}
}
这就是滑动菜单的工作原理和连接方式。
【问题讨论】:
-
为此,必须为属性
delegateReloadTheme分配一个对象,该对象在代码中的某个位置实现ReloadTheme协议。是这样吗? -
不,但我知道它需要完成,我只是不知道在哪里做......
-
@Dani 当您在此处放置断点时它显示为零,因为您的委托是您从未设置过的可选对象。
-
尝试在 viewDidLoad 中设置您的代理
-
@Dani 看看答案。另外,请提供以某种方式连接 DashboardVC 和侧菜单的代码
标签: swift uiviewcontroller protocols