我试图在整个应用程序中实现光明和黑暗的主题。我的问题是它不能正常工作。我有一个包含2ContainerVC-ContainerViewsSidebarMenuVCDashboardVCSidebarMenuVC是偏移量,因此最初会显示用户。
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/

10-10 21:33