Swift 如何将SecondViewController上的UISlider值传输到FirstViewController上的报警?

Swift 如何将SecondViewController上的UISlider值传输到FirstViewController上的报警?,swift,xcode,Swift,Xcode,我有两个视图控制器,第一个视图控制器和第二个视图控制器。 在SecondViewController上有UISlider。FirstViewController上有一个警报 现在,我想将UISlider值(即FirstViewController上的报警音量)传输到alarm 另外,我想做的功能与默认的iPhone设置滑块完全相同 如果你们能告诉我你们的知识,我会很高兴的 import UIKit import AVFoundation class FirstViewController: U

我有两个视图控制器,第一个视图控制器和第二个视图控制器。 在SecondViewController上有UISlider。FirstViewController上有一个警报

现在,我想将UISlider值(即FirstViewController上的报警音量)传输到alarm

另外,我想做的功能与默认的iPhone设置滑块完全相同

如果你们能告诉我你们的知识,我会很高兴的

import UIKit
import AVFoundation

class FirstViewController: UIViewController, AVAudioPlayerDelegate, 
UITableViewDelegate, UITableViewDataSource{

let TODO = ["A", "B", "C"]

let notificationCenter = NotificationCenter.default
var volume = Float()
var counter = 0
var timer = Timer()
var startTime:Double = 0.0
var audioPlayer: AVAudioPlayer!
@IBOutlet weak var tableView: UITableView!

@IBAction func firstSwitch(_ sender: UISwitch)
{
    if (sender).isOn
    {
        timer = Timer.scheduledTimer(withTimeInterval: 1 * 1, repeats: false, block: { timer in


            self.audioPlayer.play()

            self.audioPlayer.numberOfLoops = -1
            print(self.audioPlayer.isPlaying)
        })
    }else{
        timer.invalidate()
        print("switch1stopped")
        self.audioPlayer.stop()
    }
}

    notificationCenter.addObserver(self, selector: #selector(catchNotification(notification:)), name: NSNotification.Name(rawValue: "test"), object: nil)

}

@objc func catchNotification(notification: Notification) -> Void {
    print("Catch notification")
    audioPlayer.volume = volumeChane.value
    //Use of unresolved identifier 'volumeChane'
}
///////////////////////////////////////////////////////////////////////////

import UIKit
import AVFoundation

class SecondViewController: UIViewController {

var audioPlayer: AVAudioPlayer!

let notificationCenter = NotificationCenter.default
@IBOutlet weak var volumeSlider: UISlider!
@IBOutlet weak var volumeLabel: UILabel!
@IBAction func volumeChange(_ sender: UISlider)
{
    volumeLabel.text = String(Int(sender.value))
    volumeSlider.value = sender.value
    audioPlayer.volume = volumeSlider.value
    notificationCenter.post(name: NSNotification.Name(rawValue: "test"), object: nil)

    audioPlayer.play()
}

override func viewDidLoad()
{
    super.viewDidLoad()

    if let url=Bundle.main.url(forResource:"Alarm",withExtension:".mp3" )
    {

        do {
            audioPlayer = try AVAudioPlayer(contentsOf:url)
            audioPlayer?.play(atTime:1 * 10)

        }catch{
            audioPlayer = nil
        }
    }else{
        fatalError("Url is nil")
    }

}
extension Notification.Name
{
   static let myNotificationName = Notification.Name("test")
}

NSNotificationCenter
用于这样的简单任务可能是一种过度使用。通常使用闭包捕获组件或视图控制器中的数据更改

SecondViewController
中创建一个包含闭包的变量:

var onVolumeChange:((值:Float)->Void)?

在监视滑块的onChange事件的
iAction
中调用它

@IBAction func volumeChange(_ sender: UISlider)
{
    self.onVolumeChange?(sender.value)
}
导航到第二个视图控制器时,从第一个视图控制器传递
onVolumeChange
闭包。我不确定您是如何执行导航的,所以我假设您是以编程方式执行的

let vc = UIStoryboard(name: "main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController")
vc.onVolumeChange = { value in 
    audioPlayer.volume = value
}
self.navigationController?.pushViewController(vc, animated: true)

您可以使用代理人谢谢您的回答。我怎么用这个?对不起,我是一个初学者,所以我想更具体的答案。。。