2016-09-30 2 views
1

У меня есть переключатель, который, когда он включен в положение «включено», поместит музыку, и когда переключатель будет установлен на «off», музыка возобновит воспроизведение. Моя проблема в том, что когда я покидаю контроллер вида, переключатель будет отображаться как «выключен», когда он включается. Код для моего коммутатора ниже, я не уверен, что писать, чтобы приложение запоминало состояние переключателя, пожалуйста, помогите.Userdefaults для сохранения состояния переключателя

// 
// SecondViewController.swift 
// Urban Sphere 
// 
// Created by Oren Edrich on 9/11/16. 
// Copyright © 2016 Oren Edrich. All rights reserved. 
// 

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) { 

    if mySwitch.isOn{ 

     if bombSoundEffect != nil { 
      bombSoundEffect.stop() 
      bombSoundEffect = nil 
     } 
    } 
    else{ 
     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() 

} 

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

} 

ответ

0

я нашел правильный ответ и решил отправить его упаковывают, любой человек имеет один и тот же вопрос.

@IBAction func saveSwitchState(sender: AnyObject) { 
    var defaults = NSUserDefaults.standardUserDefaults() 

if bluetoothSwitch.on { 
    defaults.setBool(true, forKey: "SwitchState") 
} else { 
    defaults.setBool(false, forKey: "SwitchState") 
} 
} 

и ...

override func viewDidLoad() { 
super.viewDidLoad() 

var defaults = NSUserDefaults.standardUserDefaults() 

if (defaults.objectForKey("SwitchState") != nil) { 
    bluetoothSwitch.on = defaults.boolForKey("SwitchState") 
} 
} 
0

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

UserDefaults.standard.set(_ value: Bool, forKey defaultName: String) 

Как это

UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus"); 
    UserDefaults.standard.synchronize(); 

При получении статуса переключатель просто использовать

let status = UserDefaults.standard.bool(forKey: "SwitchStatus"); 

UPDATE:

@IBAction func switchpressed(_ sender: AnyObject) { 

UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus"); 

if mySwitch.isOn{ 

    if bombSoundEffect != nil { 
     bombSoundEffect.stop() 
     bombSoundEffect = nil 
    } 
} 
else{ 
    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 :(
    } 
} 
} 

Надеется, что это помогает

Счастливого кодированию ...

+0

Где я должен помещать эту строку кода «UserDefaults.standard.set (_ значение: Bool, forKey defaultName: String)» –

+2

Там нет необходимости называть 'synchronize' каждый раз, когда вы обновляете по умолчанию пользовательские – Paulw11

+0

Я только что задал вопрос показать полный код в моем контроллере просмотра, можете ли вы обновить свой ответ, чтобы показать, где я должен добавить код «пользовательские значения по умолчанию» в –

1

Вы хотите знать, где, чтобы вставить код, я думаю.


updata


updata2 Затем вы можете запустить непосредственно. Если это полезно, попробуйте ответить на этот вопрос.

import Foundation 
import UIKit 
import SpriteKit 
import AVFoundation 


class SecondViewController: UIViewController { 

     static let bombSoundEffect = {()->(AVAudioPlayer) in 

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

     var sw = false 

     var Ghost = SKSpriteNode() 


     @IBOutlet var mySwitch: UISwitch! 

     @IBAction func switchpressed() { 

      if mySwitch.isOn{ 

       SecondViewController.bombSoundEffect.play() 
      }else{ 

       SecondViewController.bombSoundEffect.stop() 
      } 

      //************* save status ************* 
      UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus"); 


     } 

     override func viewDidLoad() { 

      super.viewDidLoad() 



      mySwitch.addTarget(self, action: #selector(switchpressed), for: .valueChanged) 

      //************* load status ************* 
      mySwitch.isOn = UserDefaults.standard.bool(forKey: "SwitchStatus"); 
      switchpressed() 

     } 



    } 
+0

Можете ли вы показать, как будет выглядеть мой код, я не знаю, как ввести код в код моего кода. –

+0

Я получаю сообщение об ошибке «bombSoundEffect» в разделе «CheckSwitchStatus». Любые мысли? –

1

У меня схожая ситуация с вашей, и я просто использую UserDefaults. Вот пошаговое руководство о том, как это сделать.

  1. Создайте переменную, как показано в следующем примере. Это позволит установить настройки по умолчанию и сохранить состояние флажка для последующего использования:

    var musicSetting = UserDefaults().string(forKey: "Music") ?? "On" 
    
  2. В вашем viewDidLoad, добавить, если заявление, что будет проверять, должен ли Флажок быть включен или выключен, как это:

    if musicSetting == "On" { 
        theNameOfYourSwitch.isOn = false 
    } else { 
        theNameOfYourSwitch.isOn = true 
    } 
    
  3. В IBAction собственности для вашего флажка, добавить, если заявление, как в следующем, что сохранит ваши настройки, в зависимости от того, что это:

    if theNameOfYourCheckbox.state == NSOnState { 
        UserDefaults().set("On", forKey: "Music") 
    } else { 
        UserDefaults().set("Off", forKey: "Music") 
    } 
    

Вот скриншот, который может помочь: image here...

+0

Это не работает, никаких мыслей? –

+0

Это просто не сохранение состояния? Или вы получаете сообщение об ошибке? Либо одно может быть простым решением. – TDM

+0

Это не сохранение состояния –