Функция делегата не вызывается - PullRequest
0 голосов
/ 02 мая 2019

у меня 2 UIViewControllers, ViewController, SecondViewController.Я определил функцию делегата в 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)
}

}

Мой второй ВК код

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 ]

1 голос
/ 02 мая 2019

в SecondViewController вы устанавливаете ....

let svc = ViewController()
svc.delegateVariable = self

Это просто создает объект класса ViewController() и затем вы устанавливаете делегата.Поэтому, когда объект.после завершения области видимости, память объекта будет автоматически увеличена.

Поток должен выглядеть следующим образом ....

Создать объект Viewcontroller в SecondViewController и установить делегата

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

Затем вставьте контроллер представления в стек навигации.

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

Реализуйте метод делегирования testDelegate в SecondViewController

 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)
  }
}
1 голос
/ 02 мая 2019

Вот почему ничего не происходит ...

let svc = ViewController()
svc.delegateVariable = self

Вы создаете НОВЫЙ ViewController, а не тот, который действительно используется.

Не похоже, что вы используете шаблон делегата правильно. Ваш ViewController не должен вызывать код на других контроллерах представления.

SecondViewController должен «сделать что-то», а затем сообщить ViewController, что он сделал.

Для математической функции вы можете просто использовать новый класс (не контроллер представления) и создавать и использовать его по мере необходимости. Вам не нужен 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) в первую очередь сообщает первому, что что-то произошло, чтобы он мог на него отреагировать.

...