在 Swift 中的 ONE ViewController 中在视图之间传递数据
Passing data between views in ONE ViewController in Swift
我所做的所有搜索都集中在视图控制器之间传递数据。这不是我真正想要做的。我有一个 ViewController,里面有多个视图。 ViewController 有一个工作正常的滑块:
var throttleSetting = Float()
@IBAction func changeThrottleSetting(sender: UISlider)
{
throttleSetting = sender.value
}
然后,在同一 ViewController 中包含的其中一个视图中,我有一个基本行(现在)设置一个初始值,稍后在代码的 DrawRect 部分中使用该值:
var RPMPointerAngle: CGFloat {
var angle: CGFloat = 2.0
return angle
}
我想要做的是将滑块的值从 ViewController 传递到 ViewController 中包含的视图,以允许 drawRect 是动态的。
感谢您的帮助!
编辑:抱歉,当我创建这个答案时,我想到了 ViewControllers。一种更简单的方法是在 SomeView 中创建一个方法并直接与其对话。
示例:
class MainViewController: UIViewController {
var view1: SomeView!
var view2: SomeView!
override func viewDidLoad() {
super.viewDidLoad()
// Create the views here
view1 = SomeView()
view2 = SomeView()
view.addSubview(view1)
view.addSubview(view2)
}
@IBAction func someAction(sender: UIButton) {
view1.changeString("blabla")
}
}
class SomeView: UIView {
var someString: String?
func changeString(someText: String) {
someString = someText
}
}
代表:
首先你创建一个协议:
protocol NameOfDelegate: class { // ": class" isn't mandatory, but it is when you want to set the delegate property to weak
func someFunction() // this function has to be implemented in your MainViewController so it can access the properties and other methods in there
}
在您的视图中,您必须添加:
class SomeView: UIView, NameOfDelegate {
// your code
func someFunction() {
// change your slider settings
}
}
最后一步,您必须添加一个 属性 委托,这样您就可以 "talk" 了。我个人认为这个 属性 是某种门,在两者之间 类 这样他们就可以互相交谈。
class MainViewController: UIViewController {
weak var delegate: NameOfDelegate?
@IBAction func button(sender: UIButton) {
if delegate != nil {
let someString = delegate.someFunction()
}
}
}
我在这里使用了一个按钮只是为了展示如何使用委托。只需将其替换为您的滑块即可更改视图的属性
编辑:我忘记提及的一件事是,您需要以某种方式将 SomeView 指定为委托。但就像我说的,我不知道你是如何创建视图等的,所以我无法帮助你。
在 MVC 模型中,视图之间无法直接通信。
总是有一个视图控制器来管理视图。视图就像控制器的爪牙。
所有通信都通过视图控制器进行。
如果您想对某些视图更改做出反应,您可以设置一个 IBAction
。然后,在该方法中,您可以更改可能具有 IBOutlet
.
的其他视图
因此,在您的示例中,您可能有一个 IBAction
用于滑块更改其值(如在您的原始问题中),您可以从中设置您想要的视图的一些 public 属性改变。如有必要,您还可以在目标视图上调用 setNeedsDisplay()
使其重绘。
我所做的所有搜索都集中在视图控制器之间传递数据。这不是我真正想要做的。我有一个 ViewController,里面有多个视图。 ViewController 有一个工作正常的滑块:
var throttleSetting = Float()
@IBAction func changeThrottleSetting(sender: UISlider)
{
throttleSetting = sender.value
}
然后,在同一 ViewController 中包含的其中一个视图中,我有一个基本行(现在)设置一个初始值,稍后在代码的 DrawRect 部分中使用该值:
var RPMPointerAngle: CGFloat {
var angle: CGFloat = 2.0
return angle
}
我想要做的是将滑块的值从 ViewController 传递到 ViewController 中包含的视图,以允许 drawRect 是动态的。
感谢您的帮助!
编辑:抱歉,当我创建这个答案时,我想到了 ViewControllers。一种更简单的方法是在 SomeView 中创建一个方法并直接与其对话。
示例:
class MainViewController: UIViewController {
var view1: SomeView!
var view2: SomeView!
override func viewDidLoad() {
super.viewDidLoad()
// Create the views here
view1 = SomeView()
view2 = SomeView()
view.addSubview(view1)
view.addSubview(view2)
}
@IBAction func someAction(sender: UIButton) {
view1.changeString("blabla")
}
}
class SomeView: UIView {
var someString: String?
func changeString(someText: String) {
someString = someText
}
}
代表:
首先你创建一个协议:
protocol NameOfDelegate: class { // ": class" isn't mandatory, but it is when you want to set the delegate property to weak
func someFunction() // this function has to be implemented in your MainViewController so it can access the properties and other methods in there
}
在您的视图中,您必须添加:
class SomeView: UIView, NameOfDelegate {
// your code
func someFunction() {
// change your slider settings
}
}
最后一步,您必须添加一个 属性 委托,这样您就可以 "talk" 了。我个人认为这个 属性 是某种门,在两者之间 类 这样他们就可以互相交谈。
class MainViewController: UIViewController {
weak var delegate: NameOfDelegate?
@IBAction func button(sender: UIButton) {
if delegate != nil {
let someString = delegate.someFunction()
}
}
}
我在这里使用了一个按钮只是为了展示如何使用委托。只需将其替换为您的滑块即可更改视图的属性
编辑:我忘记提及的一件事是,您需要以某种方式将 SomeView 指定为委托。但就像我说的,我不知道你是如何创建视图等的,所以我无法帮助你。
在 MVC 模型中,视图之间无法直接通信。 总是有一个视图控制器来管理视图。视图就像控制器的爪牙。 所有通信都通过视图控制器进行。
如果您想对某些视图更改做出反应,您可以设置一个 IBAction
。然后,在该方法中,您可以更改可能具有 IBOutlet
.
因此,在您的示例中,您可能有一个 IBAction
用于滑块更改其值(如在您的原始问题中),您可以从中设置您想要的视图的一些 public 属性改变。如有必要,您还可以在目标视图上调用 setNeedsDisplay()
使其重绘。