Swift - 在另一个视图控制器中更改变量,而不知道类名?

时间:2016-09-18 15:01:26

标签: ios swift uiviewcontroller

假设我在viewController1中有一个函数,它在调用函数的任何视图控制器中更改变量(在本例中为viewController2)

我一直在尝试 -

在viewController1中声明函数:

func changeVariable(controller: UIViewController) {
    controller.variable = "Hello"
}

从viewController2调用函数:

changeVariable(self)

但是,这在声明函数时给出了一个错误,告诉我UIViewController没有名为'变量'的成员。

如果我然后将功能更改为:

func changeVariable() {
    viewController2.variable = "Hello"
}

有效。但是,我不知道哪个视图控制器事先调用了该函数(例如,它可能是viewController3),所以我无法在函数中明确说明。

有谁知道如何才能使这项工作?

非常感谢。

1 个答案:

答案 0 :(得分:4)

这是协议的用途:当您不想共享其确切名称时,在类之间定义公共语言。

您可以定义一个描述CommonVariable字符串的variable协议:

protocol CommonVariable: class {
    var variable: String { get set }
}

然后编辑您的ViewController2定义以符合此协议:

class ViewController2: UIViewController, CommonVariable {
    var variable = ""
}

并修改您的ViewController1方法以接受CommonVariable作为参数:

class ViewController1: UIViewController {
    func changeVariable(controller: CommonVariable) {
        controller.variable = "Hello"
    }
}

现在这个方法对controller一无所知,只不过它是一个带有variable字符串的类。

因此,您可以在不知道班级名称的情况下从ViewController2调用该方法:

func someFunc() {
    viewController1.changeVariable(controller: self)
}

作为旁注,CommonVariablevariableViewController1ViewController2都是错误的名称。不确定你是否真的使用这些名称,但你应该瞄准更具描述性的东西。