协议未执行



我正在尝试在整个应用程序中实现明暗主题。我的问题是它无法正常工作。我有一个包含 2 个ContainerViewsContainerVC-SidebarMenuVCDashboardVC.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()
}
}
}

这就是滑动菜单的工作方式,它是连接的。

您需要在某个地方分配您的委托 - 它是可选类型。

例如,在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

最新更新