我有两个.swift文件,所以我希望其中一个文件修改另一个类的IBoutlet标签的文本。
第1课:
class class1: UIViewController {
@IBOutlet var label1: UILabel!
}
第2课:
class class2: SKScene {
var cool_variable = 1
func coolFunc () {
class1.label1.text = "\(cool_variable)"
}
}
通过这样做我收到以下错误消息: 实例成员“label1”不能用于“class2”类型
提前致谢!
答案 0 :(得分:0)
类和实例之间的区别和关系对面向对象编程绝对至关重要。因此,请考虑您提出的代码:
func coolFunc () {
class1.label1.text = "\(cool_variable)"
}
此处的问题是class1
是类的名称。 (如果你这样做,那就更明显了,请遵循类名以大写字母开头的基本规则。)但label1
是一个实例属性 。因此,您需要的是class1
类的实例的名称 - 可能是对已经属于视图层次结构的实际现有实例的引用。
答案 1 :(得分:0)
我不知道您要解决的确切问题,但我只想考虑您要在class1
class2
中访问变量的部分。有两种基本方法可以解决这个问题,一种是继承,另一种是创建对象。这些是您需要熟悉的基本面向对象编程概念。
Swift不支持多重继承。因此,除了继承两个类SKScene
和UIViewController
之外,因此排除继承以解决您的问题。
在class1
中创建一个对象,然后调用函数coolFunc
class class1: UIViewController {
@IBOutlet var label1: UILabel!
func modifyLabel(){
let someObject = class2()
someObject.coolFunc()
}
}
当然,这个解决方案可能不是您正在寻找的解决方案。如果您需要一个适合您的解决方案,您将不得不详细解释您所面临的问题。
答案 2 :(得分:0)
您永远不会在class1
中创建class2
的实例来访问变量。
我的猜测是你正在使用Storyboard。在这种情况下,您不希望创建class1
的实例。相反,你会使用委托(如果你不使用故事板,这也是一个好主意。)
代表团可能是一个复杂的话题,所以我会尽量保持这个简单。
首先,您从一个协议开始。通常你将它命名为<CLASS-NAME>DataSource
,所以你会做类似的事情:
protocol class2DataSource: class {}
委派协议需要class
关键字。
然后,当您在协议委托的类中调用方法时,您将在其他类中添加要调用的方法,例如,willCoolFunc
:
protocol class2DataSource: class {
func willCoolFunc(with variable: Int)
}
您有参数,因此您可以按照自己的意愿访问变量cool_variable
。
接下来,您需要在class2
中创建一个class2DataSource
类型的变量:
weak var dataSource: class2DataSource?
确保变量为weak
且可选。
接下来,调用方法,您可以在coolFunc
:
func coolFunc () {
dataSource?.willCoolFunc(with: cool_variable)
}
现在,要在调用该函数时访问cool_variable
,您需要在class2DataSource
上实施class1
。创建实现class1
的{{1}}扩展,并添加函数class2DataSource
:
willCoolFunc
现在您可以访问extension class1: class2DataSource {
func willCoolFunc(with variable: Int) {
}
}
中的变量cool_variable
了!原因是因为当您调用class1
时,class2.coolFunc()
方法会在传入willCoolFunc
的情况下调用。任何实现cool_variable
的类都可以访问class2DataSource
cool_variable
方法。
要完成该方法,扩展的外观如下:
willCoolFunc
我们差不多完成了,但并不完全。我们仍然需要将extension class1: class2DataSource {
func willCoolFunc(with variable: Int) {
self.label1.text = "\(variable)"
}
}
设置为class1
的数据源。为此,我将从this post
转到Interface Builder。
在对象库的搜索文本字段中键入“对象”,然后将“对象”拖动到包含连接到的视图控制器
class2DataSource
(即执行与添加任何视图或视图控制器相同的操作 故事板场景,除了您不添加视图或视图 控制器,但抽象对象)。在故事板的左侧“场景”面板中,突出显示刚刚添加的对象;在右侧面板中转到“身份检查员”和 键入
class1
而不是预定义的NSObject。在左侧 面板('Scenes'),'Object'将重命名为'Class2 Data Source' 自动- 醇>
在故事板的左侧“场景”面板中,从您的UIView [ *而不是控制器* ]控制拖动到'Class2数据源'; 在弹出窗口中,选择dataSource outlet。
有!现在,当您致电class2DataSource
时,您已将class1
的{{1}}文字设为label1
的值!