Swift 如何将SecondViewController上的UISlider值传输到FirstViewController上的报警?
我有两个视图控制器,第一个视图控制器和第二个视图控制器。 在SecondViewController上有UISlider。FirstViewController上有一个警报 现在,我想将UISlider值(即FirstViewController上的报警音量)传输到alarm 另外,我想做的功能与默认的iPhone设置滑块完全相同 如果你们能告诉我你们的知识,我会很高兴的Swift 如何将SecondViewController上的UISlider值传输到FirstViewController上的报警?,swift,xcode,Swift,Xcode,我有两个视图控制器,第一个视图控制器和第二个视图控制器。 在SecondViewController上有UISlider。FirstViewController上有一个警报 现在,我想将UISlider值(即FirstViewController上的报警音量)传输到alarm 另外,我想做的功能与默认的iPhone设置滑块完全相同 如果你们能告诉我你们的知识,我会很高兴的 import UIKit import AVFoundation class FirstViewController: U
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)
您可以使用代理人谢谢您的回答。我怎么用这个?对不起,我是一个初学者,所以我想更具体的答案。。。