如何打乱一组 UIViews
Posted
技术标签:
【中文标题】如何打乱一组 UIViews【英文标题】:How to shuffle an array of UIViews 【发布时间】:2019-02-01 14:48:03 【问题描述】:我正在尝试构建一个应用程序,其中有 10 个 UIView,当您按下按钮时,它会一次随机显示一个。我创建了一个视图数组(我不知道我是否以正确的方式这样做)并且我正在尝试编写函数来显示它们(随机,一次一个)。 所以现在我有十个 UIView(我只是放一个在这里给你看,但我有 10 个):
@IBOutlet weak var messageView: UIView!
var messageArray = [UIView] ()
var currentVisibleMViews = 1
在 viewDidLoad 里面(显然我还是做了 10 次):
messageArray.append(messageView)
现在,我也连接了按钮并尝试了不同的方法。现在是这样的:
@IBAction func addMessageViewButton(_ sender: Any)
if currentVisibleMViews > 9
messageArray.forEach (uiview) in
uiview.isHidden = true
currentVisibleMViews = 0
else
messageArray[currentVisibleMViews].isHidden = false
currentVisibleMViews += 1
这样,它会按顺序一次显示一个视图,但是当我有 10 个视图时,它会将它们全部删除。 另外,例如,如果我有 8 个视图,我关闭 messageView6 并再次按 addMessageViewButton,它不会显示 messageView6 而是 messageView9(这就是我希望它们是随机的原因)。
我用谷歌搜索了如何做我想做的事,它说我应该尝试 Fisher Yates Shuffle 算法,但我不知道该怎么做,因为我的数组包含 UIViews。有什么解决办法吗?
【问题讨论】:
let randomMessage = messageArray.randomElement()
【参考方案1】:
我会避免保留可以轻松计算的状态,因为它只会让你的事情变得复杂:
@IBAction func addMessageViewButton(_ sender: Any)
let hiddenViews = messageArray.filter $0.isHidden
guard !hiddenViews.isEmpty else
// hide everything if nothing else to show
messageArray.forEach $0.isHidden = true
return
// show random view
let randomHiddenView = hiddenViews.randomElement()
randomHiddenView.isHidden = false
【讨论】:
太棒了!我对此进行了编辑并发出警报,而不是隐藏显示的内容。效果很好!【参考方案2】:您是否听说过或尝试过使用原生 Swift 方法shufle()
?
https://developer.apple.com/documentation/swift/array/2994753-shuffle
var names = [uviewC, uviewF, uviewE, uviewA, uviewD, uviewB]
names.shuffle(using:)
会产生类似的结果,例如:
[uviewD, uviewE, uviewB, uviewC, uviewF, uviewA]
【讨论】:
我不认为这就是你使用 UIViews 的方式以上是关于如何打乱一组 UIViews的主要内容,如果未能解决你的问题,请参考以下文章