无法在 IOS Swift 中使用委托方法关闭侧边菜单

Posted

技术标签:

【中文标题】无法在 IOS Swift 中使用委托方法关闭侧边菜单【英文标题】:unable to dismiss side menu using delegate method in IOS Swift 【发布时间】:2020-06-21 07:53:17 【问题描述】:

所以,基本上,我使用 pod 中的模块侧边菜单实现了 SideMenu。但是,我被困在最后一部分,当我点击菜单中的任何选项时,侧边菜单将自行关闭并根据我选择的菜单选项显示相应的内容。

我的主视图控制器代码如下:

类配置文件:UIViewController、MenuControllerDelegate

var menu: SideMenuNavigationController?
var menuController:MenuListController!

覆盖 func viewDidLoad()

    super.viewDidLoad()
    // Do any additional setup after loading the view.
    menu = SideMenuNavigationController(rootViewController: MenuListController())
    menu?.leftSide = true
    menu?.setNavigationBarHidden(true, animated: false)
    
    SideMenuManager.default.leftMenuNavigationController = menu
    SideMenuManager.default.addPanGestureToPresent(toView: self.view)
    setupNavBaritem()


func handleMenuToggle(menuOption: String?) 
    print("menuToggle function reached")
    menu?.dismiss(animated: true, completion: nil)


func setupNavBaritem() 
    let menuicon = UIImage(named: "menu")
    let menubtn = UIButton(type: .system)
    menubtn.setImage(menuicon, for: .normal)
    menubtn.frame = CGRect(x: 0, y: 0, width: 35, height: 35)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: menubtn)
    menubtn.addTarget(self, action: #selector(menubtntapped), for: .touchUpInside)
    navigationController?.navigationBar.isTranslucent = false


@objc func menubtntapped()
    present(menu!,animated:true)


那么这是我的菜单控制器:

类 MenuListController:UITableViewController

var menuitems = ["1","2","3","4"]
var delegate:MenuControllerDelegate?

override func viewDidLoad() 
    super.viewDidLoad()
    tableView = UITableView()
    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(MenuCell.self, forCellReuseIdentifier: "menucell")


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return menuitems.count


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "menucell", for: indexPath) as! MenuCell
    let menuetext = menuitems[indexPath.row]
    let menuicon = menuimg[indexPath.row]
    cell.setmenucell(iconimg: menuicon, text: menuetext)
    return cell


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let selectedMenu = menuitems[indexPath.row]
    tableView.deselectRow(at: indexPath, animated: true)
    delegate?.handleMenuToggle(menuOption: selectedMenu)

这是我的协议:

协议 MenuControllerDelegate

func handleMenuToggle(menuOption:String? )

新的更新! 通过委托设置,我可以访问切换功能并打印(“menuToggle 功能已达到”)。但我的解雇不起作用。我一直在寻找一段时间,似乎很多人在使用解除功能来解除这个侧边菜单时遇到了麻烦。任何可能适用于此的解决方法?我尝试了一些,包括设置新的根控制器,但没有用

【问题讨论】:

【参考方案1】:

在委托调用时更改 centeController 的框架。想要关闭时设置为 0。

UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseInOut, animations: 
                self.centerNavigationController.view.frame.origin.x = self.centerNavigationController.view.frame.width - 80
            , completion: nil)

【讨论】:

你指的是我的代表内部的handlemenutoggle func吗?我认为问题是我的handleMenuToggle func中的打印语句永远不会到达大声笑当我点击菜单中的单个单元格时没有打印任何内容。 @Jason Yin 通过代表调用 handleMenuToggle 【参考方案2】:

我错过了这个函数中的委托

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    let selectedMenu = menuitems[indexPath.row]
    let temp = Profile()
    tableView.deselectRow(at: indexPath, animated: true)
    self.delegate = temp
    delegate?.handleMenuToggle(menuOption: selectedMenu)

现在,我可以打印出我的 menutoggle 功能了!

【讨论】:

以上是关于无法在 IOS Swift 中使用委托方法关闭侧边菜单的主要内容,如果未能解决你的问题,请参考以下文章

使用 iOS 和 Swift 3 在委托方法中未接收到 xmpp 存在

为啥需要在一个视图控制器中使用委托? [关闭]

Google Sign In 调用 App Delegate 中的方法后关闭 View Controller (iOS / Swift)

没有在 NSObject 类 ios swift 中获取委托方法的回调

如何在ios中同时实现标签栏和侧边菜单?

如何使用代码连接数据源和委托 - iOS Swift