У меня есть 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 и вы стали первым респондентом, который работает не так, как обычно, вам, вероятно, нужно добавить в очередь отправки, как указано выше!