带有 UISlider 的 VC 更改 VC2 上的文本字段
Posted
技术标签:
【中文标题】带有 UISlider 的 VC 更改 VC2 上的文本字段【英文标题】:VC with UISlider to change textfield on VC2 【发布时间】:2018-01-11 22:10:36 【问题描述】:我有一个 View 控制器,它在 ContainerView 中嵌入了一个 tableView,在 ContainerView 下方我有一个 UISlider。我在 UISlider 的视图控制器上有代码,在另一个控制表格视图的视图控制器上有代码。
UISlider 的属性是根据选定的文本字段设置的 - 这部分代码有效。我正在努力创建一个在 UISlider 移动时将更改 textField 值的函数/功能。我认为 UISlider Action 需要在控制 UISlider 的代码上,但是当滑块移动以更新位于 tableCell 中的 textField 时,我无法确定如何在两个 viewController 之间转换 UISlider.setvalue 的值。希望有点道理。
// UISlider ViewController
override func viewDidLoad()
super.viewDidLoad()
sliderOutlet.isContinuous = true
sliderOutlet.tintColor = UIColor.green
self.refreshSlider()
@objc func refreshSlider()
sliderOutlet.minimumValue = Float(GlobalSliderValues.minimumValue)
sliderOutlet.maximumValue = Float(GlobalSliderValues.maximumValue)
sliderOutlet.value = Float(GlobalSliderValues.sliderValue)
// if let chgIntValue = Int(GlobalSliderValues.changeValue)
// sliderOutlet.setValue(Float(Double(chgIntValue)), animated: true)
//
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.refreshSlider), name: Notification.Name("refreshSlider"), object: nil)
override func viewDidDisappear(_ animated: Bool)
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self, name: Notification.Name("refreshSlider"), object: nil)
TableView 控制器
override func viewDidLoad()
super.viewDidLoad()
mortgageAmount.addTarget(self, action: #selector(chgTextFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
@objc func chgTextFieldDidChange(textField: UITextField)
if let chgStringValue = mortgageAmount.text
if Double(chgStringValue) ?? 1 > 10000
let alert = UIAlertController(title: "Input Error", message: "Value cannot be greater than 10000", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
return
GlobalSliderValues.minimumValue = 10
GlobalSliderValues.maximumValue = 10000
GlobalSliderValues.sliderValue = Int(mortgageAmount.text!)!
GlobalSliderValues.mortageAmountValue = Float(Int(mortgageAmount.text!)!)
NotificationCenter.default.post(name:Notification.Name("refreshSlider"), object: nil)
if let chgIntValue = Int(chgStringValue)
GlobalSliderValues.changeValue.setValue(Float(Double(chgIntValue)), animated: true)
@IBAction func valueChanged(_ sender: UISlider)
mortgageAmount.text = String(format: "%.2f",Double(sender.value))
struct GlobalSliderValues
static var minimumValue = Int()
static var maximumValue = Int()
static var lowerValue = Int()
static var UpperValue = Int()
static var locationValue = Int()
static var sliderValue = Int()
static var sliderChgValue = ""
【问题讨论】:
【参考方案1】:我们不需要通知中心来处理刷新滑块。由于我们使用常量来存储值,因此您的代码可以更改如下
class ViewController: UIViewController
@IBOutlet weak var sliderOutlet: UISlider!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
sliderOutlet.isContinuous = true
sliderOutlet.tintColor = UIColor.green
@objc func refreshSlider()
DispatchQueue.main.async
self.sliderOutlet.minimumValue = Float(GlobalSliderValues.minimumValue)
self.sliderOutlet.maximumValue = Float(GlobalSliderValues.maximumValue)
self.sliderOutlet.value = Float(GlobalSliderValues.sliderValue)
print(self.sliderOutlet.minimumValue)
print(self.sliderOutlet.maximumValue)
print(self.sliderOutlet.value)
override func viewDidAppear(_ animated: Bool)
super.viewDidAppear(animated)
self.refreshSlider()
我输入的抵押金额为 1098,所以滑块如下所示
【讨论】:
感谢您的帖子。我认为此代码仅在 tableView 和 UISlider 位于同一视图控制器上时才有效。容器视图内的 TableView。我的代码在两个视图控制器上。一个用于表格视图,另一个用于 UISlider。 我没有提到类似的事情。视图控制器是导航控制器的根视图,当单击视图控制器上的编辑按钮时将显示表格视图。明确您要更新的内容以及视图控制器在视图中的放置方式以上是关于带有 UISlider 的 VC 更改 VC2 上的文本字段的主要内容,如果未能解决你的问题,请参考以下文章
我可以更改调用 presentViewController 的 ViewController 吗?