2017-11-10 4 views
0

보기 컨트롤러간에 변경 한 후에 UISwitch의 상태를 저장하고 싶습니다. 어떤 도움이라도 대단히 감사하겠습니다! 스위치의 경우 백그라운드에서로드SWIFT 4에서 UISwitch의 상태를 저장하는 방법은 무엇입니까?

@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() 
     } 
    } 

그리고 두 번째보기 컨트롤러 또는 전혀 음악 :

내가 다른보기 컨트롤러에서 배경 음악을 제어하기 위해, UISwitch으로 첫 번째보기 컨트롤러가

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() 
    } 
: 나는 음악과 함께 클래스가 또한

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() 
      } 
     } 
    } 

: ON 또는 OFF입니다 0

}

이제보기 컨트롤러 사이의 배경 음악이 완벽하게 작동하며 켜고 끌 수는 있지만 불행히도 UISwitch의 현재 상태는 저장하지 않으며 항상 입력 할 때 First View Controller에서 스위치의 상태는 On입니다.

또한 슬라이더에 어떻게 적용 할 수 있는지 생각해보십시오.

도움이 될 것입니다.

감사

+0

MusicHelper는 모달로 표시됩니까? –

+0

감사합니다. "ViewControllers를 변경할 때 UISwitch 상태를 유지하는 방법"에서 해결책을 찾았습니다. 그것은 내가 찾고 있었던 바로 그 것이었다! – Manu

답변

0

당신이이 상태를 앞뒤로 전환 사이에 보존됩니다 static var isSwitchOn: Bool = false

생성하는 것을위한 가장 쉬운 방법.

음악이 재생되어있는 경우는, 상태를 반영한다
0

...

class MusicHelper { 
    public isPlaying: Bool { 
     get { 
      return musicBackgroundIntro.isPlaying 
     } 
    } 

// your stuff here.. 

} 

다른 뷰 컨트롤러에서 그 방법 :

SwitchMusic.isOn = MusicHelper.sharedHelper.isPlaying 

이에 대한 응답으로 업데이트 할 다른 뷰 컨트롤러가 필요한 경우 필요한 경우 대리자 이벤트 (일명 관찰자라고도 함)를 추가 할 수 있습니다.

0

viewcontroller1에 스위치를 만들 때 스위치에 기본값을 지정할 수 있습니다.

해당 스위치에 (default.value(forKey:"switchOn") as! Bool) ?? false을 할당하십시오.

+0

또는 prepare (segue : UIStoryboardSegue, 발신자 : Any?)를 사용하십시오. –

0

다음과 같이 시도하십시오. UISwitch@IBOutlet으로 사용하십시오.

@IBOutlet weak var checkState: UISwitch! 

override func viewDidLoad() { 
     super.viewDidLoad() 
    self.checkState.addTarget(self, action: #selector(action(sender:)), for: .valueChanged) 
} 

// Save state 
func action(sender: UISwitch) { 

    let userDefaults = UserDefaults.standard 
    userDefaults.set(sender.isOn, forKey:"identifier") 

} 

// Retrieve state 
override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

    let userDefaults = UserDefaults.standard.bool(forKey: "identifier") 
    self.checkState.setOn(userDefaults, animated: false) 

} 
관련 문제