在 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() 使其重绘。