我有2个UIViewControllers
,ViewController
,SecondViewController
。我在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)
}
}
这里我只是传递少量数据进行练习,但是任何人都可以为我提出一些高级委托示例教程链接。
答案 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)
}
}