为什么 UIDeferredMenuElement 不能添加到 UIAction 数组中,而可以用一个组成数组?

问题描述 投票:0回答:1

说你有

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) } })
    
ios arrays swift uibutton uiaction
1个回答
0
投票
解释是

children

 是一个
协议 UIMenuElement 的数组,UIMenu 和 UIAction 都符合该协议。

如果您显式输入

ele

 作为 UIMenuElement 数组,您也可以执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.