arrays - 如何打乱一组 UIViews

标签 arrays swift view shuffle

我正在尝试构建一个有 10 个 UIView 的应用程序,当您按下一个按钮时,它一次随机显示一个。我创建了一个 View 数组(我不知道我是否以正确的方式做到了)并且我正在尝试编写函数来显示它们(随机地,一次一个)。 所以现在我有十个 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

   }

  }

这样,它会按顺序一次显示一个 View ,但是当我有 10 个 View 时,它会将它们全部删除。 另外,例如,如果我有 8 个 View ,我关闭 messageView6 并再次按下 addMessageViewButton,它不会显示 messageView6 而是 messageView9(这就是为什么我希望它们是随机的)。

我在谷歌上搜索了如何做我想做的事,它说我应该尝试 Fisher Yates Shuffle 算法,但我不知道该怎么做,因为我的数组包含 UIView。有什么解决办法吗?

最佳答案

我会避免保留可以轻松计算的状态,因为它只会让你的事情变得复杂:

@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
}

关于arrays - 如何打乱一组 UIViews,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54481805/

相关文章:

java - 我正在尝试编写一种方法,对数组中的相邻单元格进行求和,并用获得的值填充第二个数组中的位置

arrays - 包含具有多个参数的 Twig

ios - NinJump Like 游戏 Swift(分数更新问题)

ios - 如何在不同的 View Controller 中创建 socket ?

c - 获取字符数组的长度

javascript - Do/While XMLHttpRequest 将所有调用的结果添加到一个数组

swift - 完美,快速,从处理程序中的请求获取服务器地址

swift - 从 KVO 获取值(value) - 返回 NSConreteValue

xcode - 如何填充 TableView 而不是 TableView Controller ?

android - getMeasuredHeight() 以像素或 dp 为单位返回值