Делегат Swift 4 не работает с childViewController

-2

Мне нужно прописать простую программу. Только один экран входа в систему, ожидающий некоторого пароля, и после настройки правильного, измените экран на "сам программа" и его функции. Я решил сделать это с помощью контейнера View и его подзаголовков. все работает нормально, но делегат, который должен отвечать за запуск этого изменения, не отвечает. В любом варианте я пробовал, ничего не изменилось... он все равно не отвечает.

Это код ViewController (main):

import Cocoa

class ViewController: NSViewController {

        @IBOutlet weak var container: NSView!

        var vc1 : ViewController1 = ViewController1()
        var vc2 : ViewController2 = ViewController2()

        override func viewDidLoad() {
            super.viewDidLoad()

            //initialise of delegate:
            vc1.delegate = self

            // set subviews:
            vc1 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController1")) as! ViewController1
            vc2 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil).instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "ViewController2")) as! ViewController2
            self.addChildViewController(vc1)
            self.addChildViewController(vc2)

            // set first view:
            vc1.view.frame = self.container.bounds
            self.container.addSubview(vc1.view)
        }

        func changeViews()
        {
            for sView in self.container.subviews {
                sView.removeFromSuperview()
            }

            // set second view:
            vc2.view.frame = self.container.bounds
            self.container.addSubview(vc2.view)
        }
    }

    extension ViewController: ViewController1_Delegate {
        func passwdEntered(_ correctPasswd: Bool) {
            if correctPasswd == true{
                changeViews()
            }
        }
    }

и это первый (SubView) код ViewController, где я вхожу в passwd:

import Cocoa

protocol ViewController1_Delegate: class {
    func passwdEntered(_ correctPasswd: Bool)
}

class ViewController1: NSViewController{

    @IBOutlet weak var passwordField: PasswordField!

    weak var delegate: ViewController1_Delegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func passwordFIeldEdited(_ sender: PasswordField) {
        delegate?.passwdEntered(true/*for testing purpose always true*/)
    }
}

Наконец, второй (SubView) код ViewController:

import Cocoa

class ViewController2: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

    }

}

Что я делаю неправильно?

Теги:
delegates
macos
viewcontroller

1 ответ

0
Лучший ответ

Сначала вы говорите следующее:

var vc1 : ViewController1 = ViewController1()
override func viewDidLoad() {
    super.viewDidLoad()
    vc1.delegate = self

Тогда вы говорите так:

    vc1 = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), 
                       bundle: nil).instantiateController(
                           withIdentifier: NSStoryboard.SceneIdentifier(
                               rawValue: "ViewController1")) as! ViewController1

Итак, вы установите себя как делегат на экземпляр ViewController1, но затем, в самой следующей строке, вы выбрасываете этот ViewController1 и заменяете его другим!

Переместите строку v1.delegate = self вниз до того, как вы установите реальное значение vc1.

  • 0
    Удивительно!!! :-) Я подозревал, что есть какое-то простое решение, но я не думал, что это так просто :-D Спасибо большое !!! :-) :-) :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню