我已经学了两天swift了,我有一个问题:(
我有两个ViewControllers,我需要从第二个调用第一个函数。
例如,我想在第一个ViewController中的变量c中添加一个,从第二个:
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
var c = 0
func c_count() {
c += 1
}
}
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func button(_sender: Any) {
//call c_count()
}
}
我尝试用途:
@IBAction func button(_sender: Any) {
let vc = FirstViewController()
vc.c_count()
}
但它说'线程1:断点1.1(1)'
2条答案
按热度按时间8fq7wneg1#
欢迎来到Swift!
您的方法无法工作,因为新示例不会有真实的的数据。每次示例化新的
FirstViewController
时,c
将被设置为0。您需要的FVC示例是视图层次结构中的示例,因此即使您没有得到断点消息,c
也不会在UI中更新。有许多方法可以克服这个问题,最有效的方法取决于程序的具体需求。以下是几种可能性:
1.如果视图控制器是嵌套的,您可以use the responder chain来允许适当的VC捕获
IBAction
消息,即使它是从子视图触发的。1.将
FirstViewController
示例保存到SecondViewController
可以访问的变量中。例如,您可以将指向FVC
的弱指针保存到SVC
上的delegate variable中,并使用协议将关系形式化。1.将变量分解为其他对象(两个VC的父对象或singleton)
1.通过视图层次结构访问示例化的VC并直接调用方法
1.使用通知发送消息,该消息将运行函数
既然你是新来的,我猜你要么要1个要么要2个。最后两个可能是脆弱的,难以调试,所以应该只尝试,如果一个更简单的方法是不可能的。
g6ll5ycj2#
您可以创建一个采用必要协议的DataSource类。下面是一个基本的例子:
在每个UIViewController中,创建MyDataSource的示例