假设我在viewController1中有一个函数,它在调用函数的任何视图控制器中更改变量(在本例中为viewController2)
我一直在尝试 -
在viewController1中声明函数:
func changeVariable(controller: UIViewController) {
controller.variable = "Hello"
}
从viewController2调用函数:
changeVariable(self)
但是,这在声明函数时给出了一个错误,告诉我UIViewController没有名为'变量'的成员。
如果我然后将功能更改为:
func changeVariable() {
viewController2.variable = "Hello"
}
有效。但是,我不知道哪个视图控制器事先调用了该函数(例如,它可能是viewController3),所以我无法在函数中明确说明。
有谁知道如何才能使这项工作?
非常感谢。
答案 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)
}
作为旁注,CommonVariable
,variable
,ViewController1
和ViewController2
都是错误的名称。不确定你是否真的使用这些名称,但你应该瞄准更具描述性的东西。