Как создать переопределение тихого переключателя? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть пользователи, которые жалуются, что в моем приложении нет звука.Я обнаружил, что это обычно происходит потому, что тихий переключатель включен, и с помощью удобного инструмента ответа я обычно могу сказать им об этом ... однако это кажется постоянной проблемой, и мне нужно это исправить.Я нашел способ отключить бесшумный переключатель с помощью следующего кода:

import UIKit
import AVKit
import AVFoundation


class InitialViewController: UIViewController {

    let defaults = UserDefaults.standard

    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            //print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                //print("AVAudioSession is Active")
            } catch _ as NSError {
                //print(error.localizedDescription)
            }
        } catch _ as NSError {
            //print(error.localizedDescription)
        }
    }
}

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

import UIKit
import AVFoundation

class CustomTableView: UITableViewController {

    let defaults = UserDefaults.standard
    let OverrideSwitch2 = "OverrideSwitch2"

    @IBOutlet weak var OverrideSwitch: UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let fixFin = defaults.value(forKey: OverrideSwitch2) {
            OverrideSwitch.isOn = fixFin as! Bool
        }

    }
    @IBAction func `switch`(_ sender: UISwitch) {
        defaults.set(sender.isOn, forKey: "OverrideSwitch2")
        if (sender.isOn == true){
            //Code to switch feature on
        } else {
            //Code to switch feature off
        }
    }
}

enter image description here

Я установил NSUserDefault на коммутаторе, чтобы проект запоминал предпочтенияи, поскольку это простое логическое значение, я мог просто вставить код в оба состояния переключателя, причем одно из них было «ложным».Однако этот переключатель находится на другом контроллере представления, и мне нужно, чтобы мой код был на начальном контроллере представления, иначе код не будет работать, пока пользователь не перейдет в настройки для его изменения.Мне нужна помощь в настройке переключателя, который может включать и выключать этот код, и чтобы UserDefault запомнил его.

1 Ответ

0 голосов
/ 14 июня 2018

Так что я не могу поверить, что я понял это, но я просто создал еще одну UserDefault, которая установит логическое значение.Если true, код для AVAudioSession запускается.Если false, ничего не выполняется.Эта UserDefault переключается через коммутатор, который также имеет UserDefault для запоминания состояния коммутатора.

Код выглядит следующим образом:

import UIKit
import CoreGraphics
import AVFoundation



class CustomTableView: UITableViewController  {

    //This is for the NSUserDefaults
    let defaults = UserDefaults.standard
    let OverrideSwitch2 = "OverrideSwitch2"
    
    //This Outlet connects the Switch
    @IBOutlet weak var OverrideSwitch: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
//These if statements only run if one is true or false
        
        //True: AVAudioSession is initialized; Silent Switch is Overridden
        if UserDefaults.standard.bool(forKey: "Key") == true {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            //print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                print("AVAudioSession")
            } catch _ as NSError {
                //print(error.localizedDescription)
            }
        } catch _ as NSError {
            //print(error.localizedDescription)
    }
        
}
    
        //False: No Code is executed, silent switch works as normal
        if UserDefaults.standard.bool(forKey: "Key") == false {
          
            //No Code Here
}
        
        //This NSUserDefault remembers if the switch is on or off
        if let switchState = defaults.value(forKey: OverrideSwitch2) {
            OverrideSwitch.isOn = switchState as! Bool
        }
    }
    
    //This IBAction is connected to the switch; It toggles the UserDefault which your app will remember next time you run it
   @IBAction func switchIsChanged(_ OverrideSwitch: UISwitch) {
    defaults.set(OverrideSwitch.isOn, forKey: "OverrideSwitch2")
        if OverrideSwitch.isOn == true {
          
            UserDefaults.standard.set(true, forKey: "Key")
            
        } else {
            
            UserDefaults.standard.set(false, forKey: "Key")
    
        }
    }
}

Проще говоря, если вы включите переключатель «Вкл.», NSUserDefault запускает функцию для инициализации сеанса, которая будет запускаться, только если bool имеет значение «истина».Если это ложь, то ничего не запускается.Все, что мне сейчас нужно, это оповещение пользователя о том, что включение или отключение переопределения будет работать только после перезапуска приложения.

...