Сохранение данных с пользовательскими настройками по умолчанию

Я делаю функцию в своем приложении, которая позволяет вам отключать музыку, я поместил туда переключатель, чтобы вы могли включать и выключать его. Тем не менее, переключатель отлично работает в приложении, когда я закрываю контроллер vie и вытаскиваю его обратно, он все равно показывает, как он был оставлен, но когда вы закрываете приложение и снова открываете его, переключатель выглядит так, как будто он выключен но он по-прежнему играет музыку. Это мой код, и я приложу изображение.

import Foundation
import UIKit
import SpriteKit
import AVFoundation




var bombSoundEffect: AVAudioPlayer!
var Ghost = SKSpriteNode()

class SecondViewController: UIViewController {

var sw = false




@IBOutlet var mySwitch: UISwitch!

@IBAction func switchpressed(_ sender: AnyObject) {

let defaults = UserDefaults.standard

    if mySwitch.isOn{
                defaults.set(true, forKey: "SwitchState")

        if bombSoundEffect != nil {
            bombSoundEffect.stop()
            bombSoundEffect = nil

        }

    }
    else{
        defaults.set(false, forKey: "SwitchState")

        let path = Bundle.main.path(forResource: "newmusic.wav", ofType:nil)!
        let url = URL(fileURLWithPath: path)


        do {
            let sound = try AVAudioPlayer(contentsOf: url)
            bombSoundEffect = sound
            sound.numberOfLoops = -1
            sound.play()
        } catch {
            // couldn't load file :(
        }

    }


}


override func viewDidLoad() {
    super.viewDidLoad()

    super.viewDidLoad()

    let defaults = UserDefaults.standard

    if (defaults.object(forKey: "SwitchState") != nil) {
        mySwitch.isOn = defaults.bool(forKey: "SwitchState")


    }
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}


}

а вот картинка введите здесь описание изображения Если вы не поняли, что я сказал выше, задавайте вопросы.


person Oren Edrich    schedule 02.10.2016    source источник
comment
Вы воспроизводите музыку в своем делегате приложения или весь ваш код находится в этом контроллере представления?   -  person Wyetro    schedule 03.10.2016


Ответы (2)


Как я понял из вашего кода, вы неправильно проверяете Пользовательские настройки по умолчанию. В вашем viewDidLoad вы должны проверить, установлено ли логическое значение ваших пользовательских настроек по умолчанию в true или нет.

override func viewDidLoad() {
    super.viewDidLoad()
    let defaults = UserDefaults.standard

    //check bool Value is set to true or not

    if defaults.bool(forKey: "SwitchState") == true {
        mySwitch.isOn = defaults.bool(forKey: "SwitchState")

    } else {
       print("false")

    }
}

Пожалуйста, проверьте этот код. Надеюсь, это поможет вам.

person Mandeep Singh    schedule 02.10.2016
comment
Я не получаю никаких ошибок, но когда я перезапускаю приложение, музыка все еще играет, но переключатель переключается в режим отключения звука. - person Oren Edrich; 02.10.2016
comment
Вы пробовали этот код и можете ли вы показать мне, что вы делаете в делегате приложения. - person Mandeep Singh; 02.10.2016
comment
У меня ничего нет в моем делегате приложения - person Oren Edrich; 02.10.2016
comment
И я использую ваш код в своем ViewController.swift - person Oren Edrich; 02.10.2016
comment
Можете ли вы выполнить отладку в viewDidLoad, когда вы перезапустите приложение, то в каком состоянии оно будет работать, например, если условие будет выполнено или еще будет выполнено. - person Mandeep Singh; 02.10.2016
comment
Как мне отладить мой ViewDidLoad? - person Oren Edrich; 02.10.2016

В viewDidLoad вам нужно проверить, когда вам нужно приостановить музыку:

// Keep this part the same
let defaults = UserDefaults.standard

if (defaults.object(forKey: "SwitchState") != nil) {
    mySwitch.isOn = defaults.bool(forKey: "SwitchState")
}

// Check to see if the switch is off, if so, stop the music
if !mySwitch.isOn {
    bombSoundEffect.stop()
    bombSoundEffect = nil
}

Вы также можете удалить повторяющийся вызов super.viewDidLoad.

Примечание. Похоже, что в вашем контроллере представления больше кода, потому что в настоящее время там нет ничего, что могло бы воспроизводить музыку, поэтому это решение может не работать. учитывая, что вы не предоставили достаточно информации.

person Wyetro    schedule 03.10.2016
comment
Я ввел именно то, что вы ввели, и когда я открываю viewController, он отключает музыку. - person Oren Edrich; 04.10.2016
comment
@OrenEdrich Разве ты не этого хочешь? - person Wyetro; 04.10.2016
comment
Нет, у меня приложение воспроизводит музыку в фоновом режиме, а этот ViewController — это меню настроек. Итак, у меня есть переключатель, который позволяет пользователю отключать музыку. Тем не менее, у меня проблема с сохранением, если переключатель установлен в выключенном состоянии. - person Oren Edrich; 04.10.2016
comment
@OrenEdrich, этот вопрос очень неясен. Вы не включаете код, когда музыка начинает играть, и вы не объяснили, когда музыка должна останавливаться/запускаться. - person Wyetro; 04.10.2016