Первый респондент стал / подал в отставку не работает в PageViewController Swift - PullRequest
0 голосов
/ 26 июня 2019

У меня есть 2 текстовых поля на 2 разных виртуальных каналах.

Предполагается, что текстовые поля станут первыми респондентами (автоматически загружать клавиатуру без нажатия) в точке загрузки страницы.

Когда пользователь нажимает кнопку «Готово» на клавиатуре, он должен уволить респондента и отклонить клавиатуру.

По какой-то причине, когда я добавляю код, позволяющий кнопке «Готово» отправить в отставку первого респондента, создается впечатление, что поле загружается первым респондентом при загрузке страницы.

На VC1 у меня есть:

//set the text field as first responder to auto open keyboard

override func viewDidAppear(_ animated: Bool) {
        authorNameOutlet.becomeFirstResponder()
    }

, а затем

//make the done button on the keypad dismiss the keyboard

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        authorNameOutlet.resignFirstResponder()
        return true
    }

Эта страница не открывает автоматически клавиатуру и не устанавливает первого респондента при загрузке страницы.

На моем втором виртуальном канале я удалил метод textFieldShouldReturn, и первый респондент работает отлично, автоматически открывая клавиатуру в текстовом поле при нажатии.Однако в этом случае кнопка «сделано» теперь ничего не делает, потому что там нет «textFieldShouldReturn».

Я не вижу, что я делаю неправильно, то, как я это вижу, я устанавливаюмой первый респондент находится в нужном месте (viewDidAppear), и респондент должен уйти в отставку только после того, как нажата кнопка «Готово»?

У меня также есть некоторая проверка, но я не думаю, что это актуально:

//disable button if not all fields completed when finished editing

    func textFieldDidEndEditing(_ textField: UITextField) {
        if titleOutlet.text?.isEmpty == false {
            confirmButtonOutlet.isEnabled = true
        } else {
            confirmButtonOutlet.isEnabled = false
        }
    }

IЯ смотрел на другие ответы, но это довольно простая реализация, и я не могу понять, почему она не работает!

ОБНОВЛЕНИЕ Так что я просто заметил, что страница перемещается немного по-другому ивспомнил, что VC1 (где он не работает) является частью контроллера PageView, а страница, на которой он работает, не работает (он просто выделен оттуда, но является обычным VC).

Я также могу подтвердить, чтодобавление textFieldShouldReturn ко второму VC не имеет значения, так что это красная сельдь.

Есть ли какая-либо причина, по которой часть PVC может изменить поведение?Интересно, есть ли другой делегат для подписки в этом VC?

UPDATE весь код для VC1, где не работает (NB. Я пытался удалить страницу исчезать, но это нене влияет на это, и это то же самое на 2-й ВК, где он работает)

import UIKit
import RealmSwift

class OnboardingNameVC: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var authorNameOutlet: UITextField!
    @IBOutlet weak var titleOutlet: UILabel!
    @IBOutlet weak var confirmButtonOutlet: UIButton!

    @IBAction func confirmNamePressed(_ sender: Any) {
        addAuthorName()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        authorNameOutlet.attributedPlaceholder = NSAttributedString(string: "Joe Bloggs",
                                                               attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray.withAlphaComponent(0.5)])
        authorNameOutlet.delegate = self
        confirmButtonOutlet.isEnabled = false
        authorNameOutlet.setBottomBorder(withColor: UIColor.lightGray)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        authorNameOutlet.becomeFirstResponder()
    }

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

    func addAuthorName() {
        let realm = try! Realm()
        let authorToCreate = AuthorPreferences()

        authorToCreate.AuthorName = authorNameOutlet.text!

        try! realm.write {
            realm.add(authorToCreate)
            performSegue(withIdentifier: "nameToTitleSegue", sender: self)
        }
    }

    //disable button if not all fields completed when finished editing

    func textFieldDidEndEditing(_ textField: UITextField) {
        if authorNameOutlet.text?.isEmpty == false {
            confirmButtonOutlet.isEnabled = true
        } else {
            confirmButtonOutlet.isEnabled = false
        }
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        authorNameOutlet.resignFirstResponder()
        return true
    }


    //animations
    func animateFade() {

        let labels : [UIView]  = [titleOutlet, authorNameOutlet, confirmButtonOutlet]

        var delay = 0.3
        let duration = 1.2

        for label in labels {
            label.fadeIn(duration: duration, delay: delay)
            delay += 0.2 // Increment delay
        }

    }
}

РЕДАКТИРОВАТЬ - РЕШЕНО!

После реализации другого поведения перехода страницыЯ понял, что VC1 является частью PageViewController.

В результате мне нужно было добавить это к viewDidAppear:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.async {
            self.authorNameOutlet.becomeFirstResponder()
        }
    }

Теперь все работает нормально.

TLDR: Если у вас есть textField в pageviewController и вы стали первым респондентом, который работает не так, как обычно, вам, вероятно, нужно добавить в очередь отправки, как указано выше!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...