如何在Swift中从另一个ViewController调用函数?

ffdz8vbo  于 2023-05-27  发布在  Swift
关注(0)|答案(2)|浏览(449)

我已经学了两天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)'

8fq7wneg

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个。最后两个可能是脆弱的,难以调试,所以应该只尝试,如果一个更简单的方法是不可能的。

g6ll5ycj

g6ll5ycj2#

您可以创建一个采用必要协议的DataSource类。下面是一个基本的例子:

class MyDataSource: SomeProtocol{
   
    func doSomething(with parameter1: Int, and parameter2: String) {
        // Perform some action using the parameters or if you want to return a value
    }
}

在每个UIViewController中,创建MyDataSource的示例

class ViewController1: UIViewController {
    let dataSource = MyDataSource()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func performAction() {
        dataSource.doSomething(with: 10, and: "Hello")
    }
}
class ViewController2: UIViewController {
    let dataSource = MyDataSource()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
    }
    
    func performAction() {
        dataSource.doSomething(with: 20, and: "World")
    }
 
}

相关问题