Делегат еще ноль - PullRequest
       12

Делегат еще ноль

0 голосов
/ 02 сентября 2018

Я передаю пользовательские данные от контроллера представления с именем CreateNewAccount другому контроллеру представления с именем ThanksForJoining. По некоторым причинам мой делегат - nil. Я использую segue, чтобы установить для моего vc.delegate значение self (= self), а идентификатор segue "thanksForJoining" относится к переходу, который соединяет CreateNewAccount с ThanksForJoining на раскадровке. Тем не менее, каким-то образом, делегат остается nil.

CreateNewAccount:

import UIKit

protocol UserInfoDelegate {
   func sendUserInfo(firstName: String, lastName: String, username: String, password: String)
}

class CreateNewAccount: UIViewController{
    @IBOutlet weak var FNInput: UITextField!
    @IBOutlet weak var LNInput: UITextField!
    @IBOutlet weak var usernameInput: UITextField!
    @IBOutlet weak var passwordInput: UITextField!

    var infoDelegate: UserInfoDelegate?

    @IBAction func sendInfo(_ sender: Any) {
        if(infoDelegate != nil){
            if(FNInput.text != nil && LNInput.text != nil && usernameInput.text != nil && passwordInput.text != nil){
                let firstName = FNInput.text
                let lastName = LNInput.text
                let username = usernameInput.text
                let password = passwordInput.text

                infoDelegate?.sendUserInfo(firstName: firstName!, lastName: lastName!, username: username!, password: password!)
            }
        }
    }
}

ThanksforJoining:

import UIKit

class ThanksForJoining: UIViewController, UserInfoDelegate {
    @IBOutlet weak var fName: UILabel!

    func sendUserInfo(firstName: String, lastName: String, username: String, password: String) {
        print(firstName)
        fName.text = firstName
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "thanksForJoining") {
            let createNewAccount: CreateNewAccount = segue.destination as! CreateNewAccount
            createNewAccount.infoDelegate = self
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Единственная возможная проблема - несоответствие идентификатора segue в коде и раскадровке

В раскадровке выберите переход между двумя венчурными капиталистами

enter image description here

А затем перейдите в инспектор атрибутов и установите идентификатор «thanksForJoining» в поле «Идентификатор»

enter image description here

Некоторые предложения

Если вы намерены проверить, заполнил ли пользователь все поля перед отправкой данных обратно, тогда этот код лучше послужит цели

if (infoDelegate != nil) {
    if let firstName = FNInput.text, firstName.count>0,
        let lastName = LNInput.text, lastName.count>0,
        let username = usernameInput.text, username.count>0,
        let password = passwordInput.text, password.count>0 {

        infoDelegate?.sendUserInfo(firstName: firstName, lastName: lastName, username: username, password: password)
    }
}
0 голосов
/ 04 сентября 2018

Прежде всего, вам необходимо подтвердить, что:

  • Вы подключили CreateNewAccount к ThanksForJoining через segue.

ViewControllersConnected

  • Идентификатор segue правильно установлен на thanksForJoining (Будьте осторожны с буквами.)

ConnectingSegue

Если что-то из этого не соответствует действительности, вы потеряли немного времени, а я потерял время на подготовку к большому тайфуну. Обновите свой вопрос, чтобы уточнить, что происходит, и подождите, пока кто-нибудь вам поможет ...


Предполагая две вещи выше, prepare(for:sender:) вызывается на контроллере представления источника. Вам нужно реализовать это в вашем CreateNewAccount классе.

CreateNewAccount:

import UIKit

class CreateNewAccount: UIViewController {
    @IBOutlet weak var firstNameInput: UITextField!
    @IBOutlet weak var lastNameInput: UITextField!
    @IBOutlet weak var usernameInput: UITextField!
    @IBOutlet weak var passwordInput: UITextField!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "thanksForJoining" {
            let destinationVC = segue.destination as! ThanksForJoining
            if
                let firstName = firstNameInput.text, !firstName.isEmpty,
                let lastName = lastNameInput.text, !lastName.isEmpty,
                let username = usernameInput.text, !username.isEmpty,
                let password = passwordInput.text, !password.isEmpty
            {
                destinationVC.receiveUserInfo(firstName: firstName, lastName: lastName, username: username, password: password)
            }
        }
    }
}

ThanksForJoining:

import UIKit

class ThanksForJoining: UIViewController {
    var firstName: String?

    @IBOutlet weak var firstNameLabel: UILabel!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        firstNameLabel.text = firstName
    }

    func receiveUserInfo(firstName: String, lastName: String, username: String, password: String) {
        print(firstName)
        self.firstName = firstName
    }
}

Кажется, что шаблон делегата слишком важен для вашей цели, и вам просто нужно определить метод передачи данных в контроллере представления назначения ThanksForJoining.

Полагаю, вы подключили свой переход с какой-то кнопки вашего CreateNewAccount. Если segue подключен от контроллера представления (не от кнопки), приведенный выше код нуждается в небольшой модификации.

Но в любом случае, в вашем исходном коде метод prepare(for:sender:) в ThanksForJoining никогда не будет вызван, поэтому делегат никогда не будет установлен. Таким образом, делегат остается nil.

0 голосов
/ 02 сентября 2018

Для начала вам нужна ссылка на класс CreateNewAccount в классе ThanksForJoining. Затем вам нужно активировать делегат, установив его равным self в классе ThanksForJoing в viewDidLoad.

class ThanksForJoining: UIViewController, UserInfoDelegate {
    var createNewAccount: CreateNewAccount?

    override func viewDidLoad() {
        super.viewDidLoad()
        createNewAccount?.infoDelegate = self
    }

{

Тогда ваши методы делегата будут работать.

...