Ios 协议不呼叫

Ios 协议不呼叫,ios,swift2,Ios,Swift2,我已经创建了一个协议MainMenuDelegate。但它不是在召唤 在我的主菜单中 import UIKit @objc protocol MainMenuDelegate { optional func toggleLeftPanel() } class MainMenu: UIViewController { var delegate: DashBoard! override func viewDidL

我已经创建了一个协议MainMenuDelegate。但它不是在召唤

在我的主菜单中

import UIKit
    @objc
    protocol MainMenuDelegate {
        optional func toggleLeftPanel()
       }
    class MainMenu: UIViewController {
        var delegate: DashBoard!

        override func viewDidLoad() {
            super.viewDidLoad()

            // Do any additional setup after loading the view.
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }

        @IBAction func selectAction(sender:UIButton) {
                delegate?.toggleLeftPanel()
        }

    }
仪表板中

import UIKit
@objc

    protocol DashBoardDelegate {

    }
    class DashBoard: UIViewController {
        var delegate: MainMenu?
        var a : MainMenu!
        override func viewDidLoad() {
        self.a = MainMenu()
        self.a.delegate = self
        }
    }
    extension DashBoard : MainMenuDelegate
    {
        func toggleLeftPanel()
        {
            print("afgygfy")
        }
    }

问题在于连接和使用视图控制器的方式。我确信您在调用委托方法时没有使用正确的对象

我在操场上创建了一个示例,可以设法调用委托方法。这里的关键行是显示对象用法的最后4行。我没有创建新的主菜单对象,也没有使用在仪表板中创建的主菜单对象。为了情节提要,我用自己的方法替换了视图控制器方法

@objc

protocol DashBoardDelegate {

}
class DashBoard: UIViewController {
    var delegate: MainMenu?
    var a : MainMenu!

    func dash() {
        self.a = MainMenu()
        self.a.delegate = self
    }
}

extension DashBoard : MainMenuDelegate
{
    func toggleLeftPanel()
    {
        print("afgygfy")
    }
}

@objc
protocol MainMenuDelegate {
    optional func toggleLeftPanel()
}
class MainMenu: UIViewController {
    var delegate: DashBoard!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func takeAction() {
        print(delegate)
        delegate?.toggleLeftPanel()
    }

}


var dash = DashBoard()
dash.dash()

var main = dash.a
main.takeAction()

在viewDidLoad中,您正在创建MainMenu的新实例,而不是使用现有的one@MidhunMP我们如何克服这个问题…您需要指定什么是主菜单,什么是仪表板?两者之间的关系如何,以便我们可以帮助您Main菜单是我的另一个控制器,dashBoard是另一个控制器。我想点击主菜单上的按钮,控制面板的调用方法。这是我们想要制作抽屉的演示。你导入了仪表板主菜单标题的相关委托吗?这不是与一个视图控制器如何呈现另一个视图控制器有关吗,在演示过程中,演示视图控制器如何在演示视图控制器上设置属性?这里有一条很细的线,但在某种程度上是肯定的。这完全取决于如何通过协议连接两个视图控制器。双方在订立合同和执行合同时应保持一致!我不明白你的最后一句话。我的意思是当涉及到协议时,你必须使用正确的对象。我认为OP创建了一个初始化的主菜单对象,当试图调用委托时,调用不同的主菜单对象。是的,这正是问题所在。但是,我假设OP实际上不知道第一个视图控制器如何创建和显示第二个视图控制器。你的回答对他没有帮助,因为他根本不理解这种关系。