如何调用func将其作为控制器之间的参数传递

时间:2017-05-26 15:31:08

标签: swift

我正在尝试创建一个动态菜单,我将文本和按钮的操作从一个控制器发送到下一个控制器,然后我想生成运行该操作的按钮,但我想要这样做。我的语法有问题。

所以作为第一个控制器中的一个例子,我有:

let vc = storyboard.instantiateViewController(withIdentifier: 
         "CompetitiveKPIChart") as! CompetitiveKPIChartViewController

    vc.Menu = [["Menu1":ClickBack()],["Menu2":ClickBack()],["Menu3":ClickBack()]]

func ClickBack() {
    self.dismiss(animated: true, completion: {});
}

并在第二个控制器中:

var Menu : [Dictionary<String,()>] = []

override func viewDidLoad() {
         let gesture2 = UITapGestureRecognizer(target: self,action: Menu["Menu1"])
    btnBack.addGestureRecognizer(gesture2)
}

如何从第二个控制器GestureRecognizer中的第一个控制器调用ClickBack()?

1 个答案:

答案 0 :(得分:0)

Menu声明的语法错误 - 对于void函数应为() -> (),而不是()

这适用于Playground,你的语法不...

var menu : [Dictionary<String,() -> ()>] = [] // Don't use capitals for variables...

func aFunc() {
    print("Hello aFunc")
}

menu = [["aFunc": aFunc]]
menu.first!["aFunc"]!() // Prints "Hello aFunc"

但是,我认为您的代码存在第二个问题。你的行

UITapGestureRecognizer(target: self,action: Menu["Menu1"])

无法编译,因为Menu是一个数组,而不是字典。我想你可能意味着

var menu : Dictionary<String,() -> ()> = [:]

在这种情况下,您的设置代码应该说

vc.menu = ["Menu1":ClickBack, "Menu2":ClickBack, "Menu3":ClickBack]

但是,有一个最终的,可能是难以克服的问题,那就是你的代码

override func viewDidLoad() {
    let gesture2 = UITapGestureRecognizer(target: self, action: menu["Menu1"])
    btnBack.addGestureRecognizer(gesture2)
}

仍然会出错,因为action:需要是Selector,这是@objc消息标识符,而不是Swift函数。

恐怕我看不出让这个(相当聪明的)想法发挥作用的好方法。是时候重构了吗?