我试图在整个应用程序中实现光明和黑暗的主题。我的问题是它不能正常工作。我有一个包含2ContainerVC
-ContainerViews
和SidebarMenuVC
的DashboardVC
。SidebarMenuVC
是偏移量,因此最初会显示用户。DashboardVC
嵌入在ContainerVC
中,并且有一个汉堡式菜单。当用户点击该菜单按钮时,将显示UINavigationController
。一切都很好。SidebarMenuVC
包含负责更改应用程序主题的图像。当用户点击图像时,图像从亮变暗,反之亦然。点击的那一刻改变了SidebarMenuVC
的主题,但是当你隐藏菜单(通过滑动)时,SidebarMenuVC
的主题不会被应用。我试着用DashboardVC
来做,但我认为我做得不对(好吧,它不起作用,所以我知道我搞砸了)。
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()
}
}
因此,大局是:当用户右击
protocol
(位于hideMenu()
中)时,它不知何故需要访问ContainerVC
并调用DashboardVC
协议/代表总是让我困惑,所以欢迎提供一点帮助。
好的,按照要求,这里是
applyTheme()
的连接方式:protocol SideBarDelegate: class {
func showMenu()
func hideMenu()
}
class DashboardVC: UIViewController {
static weak var delegateSideBar: SideBarDelegate?
@IBAction func sideMenuButtonPressed(_ sender: UIBarButtonItem) {
Dashboard.delegateSideBar?.showMenu()
}
}
然后在
sidebarMenu
中: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()
}
}
}
这就是刷卡菜单的工作原理和它的连接方式。
最佳答案
您需要将代理分配到某个位置-这是可选类型。
例如,在viewDidLoad
中可以说item.delegateReloadTheme = self
。
您需要显示有关DashboardVC
的更多代码。
基本上,当您创建委托时,您正在为需要委托的工作创建接口,并将其委托给其他类。因为几乎可以在代码中的任何地方实现委托,所以需要告诉谁负责实现该委托(接口)。
例如:
protocol RefresherDelegate {
func refreshUI()
}
在这里,我们定义哪些函数将被委托。
class MyView : UIView {
var delegate: RefresherDelegate?
}
在这里,我们创建一个变量来保存实际符合
RefresherDelegate
的对象。class MyObject : RefresherDelegate {
var myView = MyView()
这里您说
MyObject
将实现RefresherDelegate
并创建简单的MyView实例(不会在UI上显示,只是简单的示例)func assignDelegate() {
myView.delegate = self
}
这是关键的一部分-将委托分配给它的实现-在这种情况下
MyObject
。在
assignDelegate()
之后,当您真正调用refreshUI()
时,它将在MyObject
中被调用。关于swift - 协议(protocol)未执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51966139/