提问人:KrisP 提问时间:7/20/2023 最后编辑:HangarRashKrisP 更新时间:7/23/2023 访问量:80
有没有办法保存UIButton的“选定”状态?
Is there a way to save 'selected' state of a UIButton?
问:
我正在为孩子们创建一个拼图游戏应用程序,在 24 个不同的场景中提供 24 个不同的小拼图。我把背景音乐放在一个单例中,就像这样:
class MusicHelper { static let sharedHelper = MusicHelper() var audioPlayerBGM: AVAudioPlayer?
func playBackgroundMusic() {
let BGM = URL(fileURLWithPath: Bundle.main.path(forResource: "jigsawBGM", ofType: "wav")!)
do {
audioPlayerBGM = try AVAudioPlayer(contentsOf:BGM as URL)
audioPlayerBGM!.numberOfLoops = -1
audioPlayerBGM!.prepareToPlay()
audioPlayerBGM!.play()
audioPlayerBGM!.volume = 0.1
} catch {
print("Cannot play the file")
}
}
func pauseBackgroundMusic() {
let BGM = URL(fileURLWithPath: Bundle.main.path(forResource: "jigsawBGM", ofType: "wav")!)
do {
audioPlayerBGM = try AVAudioPlayer(contentsOf:BGM as URL)
audioPlayerBGM!.pause()
} catch {
print("Cannot play the file")
}
}
}
为了家长的理智,我还写了一段代码来静音BGM。这样:
@IBOutlet weak var muteMusicButton: UIButton!
@IBAction func muteMusic(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
if muteMusicButton.isSelected {
MusicHelper.sharedHelper.pauseBackgroundMusic()
} else {
MusicHelper.sharedHelper.playBackgroundMusic()
}
}
我已将muteMusicButton放在单独的视图控制器场景中(例如应用程序用户的“控件”或“设置”窗口)。这是一个自定义按钮,具有默认状态(“音乐开启”图像)和选定状态(“音乐关闭”图像)的不同图像。 问题在于,当其视图控制器被关闭时,按钮会重置为默认状态,因此当您再次访问视图控制器时,音乐仍处于暂停状态,但该按钮显示“音乐开启”图像,您必须按两次才能再次启动音乐。
有没有办法让按钮在关闭/重新访问其视图控制器时“记住”其选择状态? (也许是UserDefault,我是出了名的无能!
还是我应该以完全不同的方式处理整个事情?
答:
听起来最好读取 的属性,以相应地更新按钮状态。isPlaying
viewWillAppear
ViewController
https://developer.apple.com/documentation/avfaudio/avaudioplayer/1390139-isplaying
override func viewWillAppear(_ animated: Bool) {
muteMusicButton.selected = !MusicHelper.sharedHelper.audioPlayerBGM.isPlaying
}
评论
super.viewWillAppear(animated)
与其说“我在UserDefault是垃圾”,不如花一点时间了解它。
不过,非常简短......
为您的设置确定一个“键”——让我们使用“isMuted”
当您要开始播放音乐时,请从以下位置读取该键的值:UserDefaults
let b: Bool = UserDefaults.standard.bool(forKey: "isMuted")
if b {
// don't play the music
} else {
// play the music
}
当您显示“设置”视图控制器(例如)时,请读取该值并设置按钮的属性:viewDidLoad
isSelected
let b: Bool = UserDefaults.standard.bool(forKey: "isMuted")
muteMusicButton.isSelected = b
当用户点击按钮时,将新值写入(基于代码):UserDefaults
@IBAction func muteMusic(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
UserDefaults.standard.set(sender.isSelected, forKey: "isMuted")
if muteMusicButton.isSelected {
MusicHelper.sharedHelper.pauseBackgroundMusic()
}
else {
MusicHelper.sharedHelper.playBackgroundMusic()
}
}
评论
使用它来存储 UserDefaults:Bool
UserDefaults.standard.set(false, forKey: "isMuted")
使用它来回读你的:Bool
let isMuted = UserDefaults.standard.bool(forKey: "isMuted")
在您的示例中:
class MusicHelper {
static let sharedHelper = MusicHelper()
var audioPlayerBGM: AVAudioPlayer?
init() {
let BGM = URL(fileURLWithPath: Bundle.main.path(forResource: "jigsawBGM", ofType: "wav")!)
audioPlayerBGM = try? AVAudioPlayer(contentsOf: BGM)
audioPlayerBGM?.numberOfLoops = -1
audioPlayerBGM?.volume = 0.1
audioPlayerBGM?.prepareToPlay()
let isMuted = UserDefaults.standard.bool(forKey: "isMuted") // here
if !isMuted {
audioPlayerBGM?.play()
}
}
func playBackgroundMusic() {
audioPlayerBGM?.play()
}
func pauseBackgroundMusic() {
audioPlayerBGM?.pause()
}
}
@IBOutlet weak var muteMusicButton: UIButton!
@IBAction func muteMusic(_ sender: UIButton) {
sender.isSelected = !sender.isSelected
if muteMusicButton.isSelected {
MusicHelper.sharedHelper.pauseBackgroundMusic()
UserDefaults.standard.set(false, forKey: "isMuted") // here
} else {
MusicHelper.sharedHelper.playBackgroundMusic()
UserDefaults.standard.set(true, forKey: "isMuted") // here
}
}
func viewWillAppear() {
muteMusicButton.isSelected = UserDefaults.standard.bool(forKey: "isMuted")
}
评论