gpt4 book ai didi

swift - 如何调用将其作为 Controller 之间的参数传递的函数

转载 作者:搜寻专家 更新时间:2023-11-01 05:34:29 24 4
gpt4 key购买 nike

我正在尝试创建一个动态菜单,在其中我将按钮的文本和操作从一个 Controller 发送到下一个 Controller ,然后我想生成运行该操作的按钮,但我遇到了问题语法。

所以作为第一个 Controller 的例子,我有:

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

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

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

在第二个 Controller 中:

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

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

如何在第二个 Controller GestureRecognizer 中调用第一个 Controller 的 ClickBack()?

最佳答案

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功能。

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

关于swift - 如何调用将其作为 Controller 之间的参数传递的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44205252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com