如何打乱一组 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的主要内容,如果未能解决你的问题,请参考以下文章

随机打乱一组数(出题)

php中给出一组数组,要求把这组数据打乱顺序后输出,而且不能重复!!请高手帮忙呀!

MATLAB中,怎样把一组给定的数据随机排列?

如何在vim中打乱列表?

如何在 Swift 中打乱数组?

如何在python中正确打乱列表