如何打乱一组 UIViews
How to shuffle an array of UIViews
我正在尝试构建一个应用程序,我有 10 个 UIViews,当你按下一个按钮时,它一次随机显示一个。我创建了一个视图数组(我不知道我是否以正确的方式做到了)并且我正在尝试编写函数来显示它们(随机地,一次一个)。
所以现在我有十个 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 算法,但我不知道该怎么做,因为我的数组包含 UIView。有什么解决办法吗?
您听说过或尝试过使用本机 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]
我会避免保留可以轻松计算的状态,因为它只会让你的事情复杂化:
@IBAction func addMessageViewButton(_ sender: Any) {
let hiddenViews = messageArray.filter { [=10=].isHidden }
guard !hiddenViews.isEmpty else {
// hide everything if nothing else to show
messageArray.forEach { [=10=].isHidden = true }
return
}
// show random view
let randomHiddenView = hiddenViews.randomElement()
randomHiddenView.isHidden = false
}
我正在尝试构建一个应用程序,我有 10 个 UIViews,当你按下一个按钮时,它一次随机显示一个。我创建了一个视图数组(我不知道我是否以正确的方式做到了)并且我正在尝试编写函数来显示它们(随机地,一次一个)。 所以现在我有十个 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 算法,但我不知道该怎么做,因为我的数组包含 UIView。有什么解决办法吗?
您听说过或尝试过使用本机 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]
我会避免保留可以轻松计算的状态,因为它只会让你的事情复杂化:
@IBAction func addMessageViewButton(_ sender: Any) {
let hiddenViews = messageArray.filter { [=10=].isHidden }
guard !hiddenViews.isEmpty else {
// hide everything if nothing else to show
messageArray.forEach { [=10=].isHidden = true }
return
}
// show random view
let randomHiddenView = hiddenViews.randomElement()
randomHiddenView.isHidden = false
}