在Swift

时间:2015-04-29 03:57:59

标签: ios swift view viewcontroller subview

我所做的所有搜索都专注于在视图控制器之间传递数据。这并不是我想要做的事情。我有一个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是动态的。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在MVC模型中,视图无法直接相互通信。 总是有一个视图控制器来管理视图。视图就像控制器小兵一样。 所有通信都通过视图控制器进行。

如果您想对某些视图更改做出反应,可以设置IBAction。在该方法中,您可以更改您可能拥有IBOutlet的其他视图。

因此,在您的示例中,您可能会有一个IBAction滑块更改其值(如原始问题中所示),您可以从中设置要更改的视图的某些公共属性。如有必要,您还可以在目标视图上调用setNeedsDisplay()以使其自行重绘。

答案 1 :(得分:0)

编辑:对不起,当我创建这个答案时,我考虑到了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
    }
}

最后一步,你必须添加委托的属性,这样你就可以“对话”了。我个人认为这个属性是两类之间的某种门,所以他们可以互相交谈。

class MainViewController: UIViewController {

    weak var delegate: NameOfDelegate?

    @IBAction func button(sender: UIButton) {
        if delegate != nil {
            let someString = delegate.someFunction()
        }
    }
}

我在这里使用了一个按钮来展示如何使用委托。只需将其替换为滑块即可更改视图的属性

编辑:我忘记提到的一件事是,你将以某种方式将SomeView指定为委托。但就像我说的,我不知道你是如何创造意见等所以我无法帮助你。