如何在ViewDidAppear和ViewDidDisappear中插入代码来自其他类

时间:2016-11-30 01:51:01

标签: ios swift

我想在UISideMenuNavigationController出现或消失时更改按钮图像。

这是一个有按钮的类。

class MenuViewController: UIViewController {

  @IBOutlet var btnMenu: UIButton!

  override func viewDidLoad() { 
    super.viewDidLoad()
  }
}

这是我要插入代码的另一个类。

open class UISideMenuNavigationController: UINavigationController {

      override open func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)

         // insert some code here but from MenuViewController class
      }

      override open func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)

        // insert some code here but from MenuViewController class
      }
}

我不想更改UISideMenuNavigationController类,因为它是来自pod的框架。

我正在使用https://github.com/jonkykong/SideMenu

中的框架侧面菜单

每当侧面菜单出现或消失时,我都需要更改按钮图像。我无法从ReadMe Side Menu找到方法。这就是为什么我认为需要在Side Menu Class中的ViewDidAppear和ViewDidDisappear方法中插入代码但不想破坏类。

2 个答案:

答案 0 :(得分:4)

您只需要子类UISideMenuNavigationController并覆盖viewDidAppear& viewDidDisappear方法来调用委托。

protocol MyUISideMenuDelegate {
    func menuDidAppear(_ menu:MyUISideMenuNavigationController) -> Void
    func menuDidDisappear(_ menu:MyUISideMenuNavigationController) -> Void
}

open class MyUISideMenuNavigationController: UISideMenuNavigationController {

    var menuDelegate: MyUISideMenuDelegate? 

    override open func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         self.menuDelegate?.menuDidAppear(self)
    }

    override open func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.menuDelegate?.menuDidDisappear(self)
    }
}

然后让您使用按钮实现协议查看控制器并将其自身设置为委托。

您还可以让您的菜单子类发送NSNotification,并让任何其他感兴趣的对象订阅这些对象。这样就可以完全解耦菜单和其他类。

答案 1 :(得分:1)

  1. 您的MenuViewController课程可以使用更改按钮上图像的功能。例如,func changeButtonMenuImage()
  2. 您的'UISideMenuNavigationController'(或其子类)可以作为属性,实例变量或IBOutlet与MenuViewController建立某种连接。例如,@IBOutlet var menuController: MenuViewController
  3. 然后您的viewDidAppearviewDidDisappear可以调用它的功能。例如,menuController.changeButtonMenuImage()