我正在尝试创建一个动态菜单,我将文本和按钮的操作从一个控制器发送到下一个控制器,然后我想生成运行该操作的按钮,但我想要这样做。我的语法有问题。
所以作为第一个控制器中的一个例子,我有:
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()?
答案 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函数。
恐怕我看不出让这个(相当聪明的)想法发挥作用的好方法。是时候重构了吗?