委托函数未调用

时间:2019-05-02 09:40:23

标签: ios swift cocoa-touch delegates protocols

我有2个UIViewControllersViewControllerSecondViewController。我在VC中定义了委托函数,并在Second VC中使用了它。但是委托函数不调用Second VC。

这是亩第一个VC 代码

import UIKit

//Step1:
protocol testDelegate {
    func testFunction(string1: String, string2:String)
    func math(a:Int, b:Int)
}

class ViewController: UIViewController {

    //Step2:
    var delegateVariable: testDelegate?


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

@IBAction func moveToSecondVC(_ sender: Any) {
    let nav = self.storyboard?.instantiateViewController(withIdentifier: "SVC") as! SecondViewController
    //Step3:
    delegateVariable?.testFunction(string1: "String1", string2: "String2")
    delegateVariable?.math(a:30, b:10)
    self.navigationController?.pushViewController(nav, animated: true)
}

}

我的第二个VC 代码

import UIKit

//Step4:
class SecondViewController: UIViewController , testDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    //Step5:
    let svc = ViewController()
    svc.delegateVariable = self
}

@IBAction func btn(_ sender: Any) {
    //Step5:
    let svc = ViewController()
    svc.delegateVariable = self
}

//Step6:
func testFunction(string1: String, string2: String) {
    print(string1+string2)
}
func math(a:Int, b:Int) {
    print(a+b)
    print(a-b)
    print(a*b)
}
}

这里我只是传递少量数据进行练习,但是任何人都可以为我提出一些高级委托示例教程链接。

2 个答案:

答案 0 :(得分:1)

这就是为什么什么也没发生...

let svc = ViewController()
svc.delegateVariable = self

您正在创建一个新的ViewController,而不使用实际使用的ViewController。

您似乎没有正确使用委托模式。您的ViewController不应在其他视图控制器上调用代码。

SecondViewController应该“做一些事情”,然后让ViewController知道它做了什么。

对于Math函数,您可以只使用一个新类(而不是视图控制器)并根据需要创建和使用它。您不需要为此的ViewController。

使用委托的示例可能类似于:

protocol CreateProfileDelegate: class {
   func didCreateProfile(profile: Profile?)
   func didCancelCreateProfile()
}

class ViewController: UIViewController {
    func showCreateProfile() {
       let vc = CreateProfileViewController() 
       vc.delegate = self
       present(vc, animated: true)
    }
}

extension ViewController: CreateProfileDelegate {

    func didCreateProfile(profile: Profile?) {
       // show the profile?
    }

    func didCancelCreateProfile() {
        // show an alert maybe? 
    }
}

通过这种方式,SecondViewController(CreateProfileViewController)基本上告诉第一个发生了什么事情,以便它可以对它做出反应。

答案 1 :(得分:1)

您正在设置SecondViewController。...

let svc = ViewController()
svc.delegateVariable = self

只需创建一个ViewController()类的对象,然后设置委托。所以当obj。范围的完成,则对象的内存将自动增加。

流程应如下所示。...

在SecondViewController中创建Viewcontroller的对象并设置委托

let vc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
vc.delegateVariable = self 

然后将视图控制器推入导航堆栈中。

self.navigationController?.pushViewController(svc, animated: true)

在SecondViewController中实现testDelegate的委托方法

 func testFunction(string1: String, string2: String) {
   print(string1+string2)
 } 

func math(a:Int, b:Int) {

}

编辑

SecondViewController的最终代码将是...

import UIKit


class SecondViewController: UIViewController , testDelegate {

override func viewDidLoad() {
  super.viewDidLoad()


 }

@IBAction func btn(_ sender: Any) {
  let vc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
  vc.delegateVariable = self 
  self.navigationController?.pushViewController(svc, animated: true)
}

//MARK:- TestDelegate Methods
 func testFunction(string1: String, string2: String) {
   print(string1+string2)
 }

  func math(a:Int, b:Int) {
    print(a+b)
    print(a-b)
    print(a*b)
  }
}