我希望在View控制器之间进行更改之后保存UISwitch的状态。任何帮助将不胜感激!
我有一个带有UISwitch的第一个View Controller,用于在不同的View Controllers中控制背景音乐:
@IBOutlet weak var SwitchMusic: UISwitch!
let defaults = UserDefaults.standard
var switchON : Bool = false
@IBAction func checkState(_ sender: UISwitch) {
if (sender.isOn == true)
{
switchON = true
defaults.set(switchON, forKey: "switchON")
MusicHelper.sharedHelper.playBackgroundMusic()
}
if (sender.isOn == false)
{
switchON = false
defaults.set(switchON, forKey: "switchON")
MusicHelper.sharedHelper.stopBackgroundMusic()
}
}
如果开关处于开启或关闭状态,则第二个视图控制器可在后台加载音乐或不加音乐:
override func viewDidLoad() {
super.viewDidLoad()
if defaults.value(forKey: "switchON") != nil{
let switchON: Bool = defaults.value(forKey: "switchON") as! Bool
if switchON == true{
MusicHelper.sharedHelper.playBackgroundMusic()
}
else if switchON == false{
MusicHelper.sharedHelper.stopBackgroundMusic()
}
}
}
我也有一节音乐课程:
class MusicHelper {
let defaults = UserDefaults.standard
static let sharedHelper = MusicHelper()
var musicBackgroundIntro:AVAudioPlayer = AVAudioPlayer()
func playBackgroundMusic() {
do {
let audioPath = Bundle.main.path(forResource: "Music", ofType: "mp3")
try musicBackgroundIntro = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
musicBackgroundIntro.numberOfLoops = -1
musicBackgroundIntro.prepareToPlay()
musicBackgroundIntro.play()
} catch {
print("Cannot play the file")
}
}
func stopBackgroundMusic() {
musicBackgroundIntro.stop()
}
}
现在它在视图控制器之间的背景中完美地工作,并且可以关闭和打开...但遗憾的是不保存UISwitch的当前状态,并且总是在我进入第一个视图时控制器Switch的状态为On。
还有任何想法,如何才能在Slider中应用?
非常感谢任何帮助!
由于
答案 0 :(得分:0)
最简单的方法是创建static var isSwitchOn: Bool = false
此状态将在来回转换之间保留。
答案 1 :(得分:0)
如果音乐在播放,你应该反映一下状态......
class MusicHelper {
public isPlaying: Bool {
get {
return musicBackgroundIntro.isPlaying
}
}
// your stuff here..
}
在其他视图控制器中这样:
SwitchMusic.isOn = MusicHelper.sharedHelper.isPlaying
如果您需要更新其他视图控制器以响应此操作,您可以根据需要添加委托事件(也称为观察者)。
答案 2 :(得分:0)
您可以在viewcontroller1
创建时为交换机指定默认值。
将(default.value(forKey:"switchOn") as! Bool ) ?? false
分配给该开关。
答案 3 :(得分:0)
尝试类似的方法:将def dval[T >: Null](x : T): T = { null }
val a1 = dval(allF)
用作UISwitch
。
@IBOutlet