我所做的所有搜索都专注于在视图控制器之间传递数据。这并不是我想要做的事情。我有一个ViewController,里面有多个Views。 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中包含的View,以允许drawRect是动态的。
感谢您的帮助!
答案 0 :(得分:1)
在MVC模型中,视图无法直接相互通信。 总是有一个视图控制器来管理视图。视图就像控制器小兵一样。 所有通信都通过视图控制器进行。
如果您想对某些视图更改做出反应,可以设置IBAction
。在该方法中,您可以更改您可能拥有IBOutlet
的其他视图。
因此,在您的示例中,您可能会有一个IBAction
滑块更改其值(如原始问题中所示),您可以从中设置要更改的视图的某些公共属性。如有必要,您还可以在目标视图上调用setNeedsDisplay()
以使其自行重绘。
答案 1 :(得分:0)
示例:
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
}
}
最后一步,你必须添加委托的属性,这样你就可以“对话”了。我个人认为这个属性是两类之间的某种门,所以他们可以互相交谈。
class MainViewController: UIViewController {
weak var delegate: NameOfDelegate?
@IBAction func button(sender: UIButton) {
if delegate != nil {
let someString = delegate.someFunction()
}
}
}
我在这里使用了一个按钮来展示如何使用委托。只需将其替换为滑块即可更改视图的属性
编辑:我忘记提到的一件事是,你将以某种方式将SomeView指定为委托。但就像我说的,我不知道你是如何创造意见等所以我无法帮助你。