说你有†
var ele = // an [UIAction]
那么,
yourButton.menu = UIMenu(children: ele)
每个应用程序都需要知道菜单何时打开,因此您使用通常的技巧,
let trick = UIDeferredMenuElement.uncached({completion in
print("menu opened")
completion([])
})
但是!如果你尝试这样做:
ele.append(trick)
不起作用!!
[X] Cannot convert value of type 'UIDeferredMenuElement' to expected argument type 'UIAction'
但是!这样做就好了! ->
aButton.menu = UIMenu(children: [ele[0], ele[1], ele[2], trick])
这个例子也可以工作
aButton.menu = UIMenu(children: ele + [trick])
但这确实不起作用
ele.append(contentsOf: [trick])
还要注意,ele.append(trick as! UIAction)
不起作用,
unrelated type
。这个神秘的谜团该如何解释?
let noms = [
("TAG", "Do crazy things", "arrowtriangle.right.and.line.vertical.and.arrowtriangle.left"),
("BLAH", "Even more\nwild stuff.", "rectangle.grid.3x2"),
("LOUT", "Logout now", "lock.open")
]
let ele = noms.map({ fn in
return UIAction(title: fn.1, image: UIImage(systemName: fn.2)) { [weak self] _ in
guard let self else { return }
aButtonProcess(fn.0)
}
})
children
是一个协议 UIMenuElement 的数组,UIMenu 和 UIAction 都符合该协议。 如果您显式输入
ele
作为 UIMenuElement 数组,您也可以执行相同的操作。