这是我的 Storyboard目前的样子:onboardingVC 包含嵌入 PageViewController 的 UIView Container,它包含对接下来 3 个 ViewControllers 的引用
在 3 个 ViewControllers(电子邮件、密码、昵称)中,我有一个文本字段,在 ViewDidLoad() 的所有 3 个 View Controller 中,我调用 textField.becomeFirstResponder()
override func viewDidLoad() {
super.viewDidLoad()
textField.becomeFirstResponder()
}
现在键盘只显示在 EmailVC 上(PageViewController 中的第一页)。
但是当我点击 Next 按钮并转到下两个 View Controller 时,键盘会显示一毫秒并立即消失。
所以,我的问题是如何让键盘持续存在、显示并集中在所有三个文本字段上
class OnBoardingViewController: UIViewController {
weak var delegate: NextPageDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func nextPage(_ sender: UIButton) {
delegate?.showNextPage()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == Const.Segue.embeded_email_registration {
delegate = segue.destination as? PageViewController
}
}
@IBAction func dismissVC(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
protocol NextPageDelegate: class {
func showNextPage()
class PageViewController: UIPageViewController {
fileprivate lazy var pages: [UIViewController] = {
return [
self.getViewController(withIdentifier: Const.EmailRegistration.EmailVC),
self.getViewController(withIdentifier: Const.EmailRegistration.PasswordVC),
self.getViewController(withIdentifier: Const.EmailRegistration.NicknameVC),
self.getViewController(withIdentifier: Const.EmailRegistration.BirthdateVC)
]
}()
fileprivate func getViewController(withIdentifier identifier: String) -> UIViewController {
return UIStoryboard(name: "Login", bundle: nil).instantiateViewController(withIdentifier: identifier)
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
if let firstVC = pages.first {
setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
}
removeSwipeGesture()
}
func removeSwipeGesture() {
for view in self.view.subviews {
if let subView = view as? UIScrollView {
subView.isScrollEnabled = false
}
}
}
扩展 PageViewController:UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
let currentIndex = pages.index(of: viewController)!
let previousIndex = currentIndex - 1
return (previousIndex == -1) ? nil : pages[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
let currentIndex = pages.index(of: viewController)!
let nextIndex = currentIndex + 1
return (nextIndex == pages.count) ? nil : pages[nextIndex]
}
extension PageViewController: NextPageDelegate {
func showNextPage() {
if let currentViewController = viewControllers?[0] {
if let nextPage = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) {
setViewControllers([nextPage], direction: .forward, animated: true, completion: nil)
}
}
}
class EmailInputViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
//textField.becomeFirstResponder()
}
override func viewWillAppear(_ animated: Bool) {
textField.becomeFirstResponder()
}
EmailInputViewController、PasswordInputViewController 和 NicknameInputViewController 代码相同
最佳答案
I have prepared a demo, Please have a look
页面 View Controller
import UIKit
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var pages = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
self.dataSource = self
// Do any additional setup after loading the view.
let first = storyboard?.instantiateViewController(withIdentifier: "first") as! FirstViewController
let second = storyboard?.instantiateViewController(withIdentifier: "second") as! SecondViewController
pages.append(first)
pages.append(second)
setViewControllers([first], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
self.addChildViewController(first)
self.addChildViewController(second)
self.didMove(toParentViewController: first)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let currentIndex: Int = pages.index(of: viewController)!
let previousIndex = abs((currentIndex - 1) % pages.count)
return pages[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let currentIndex: Int = pages.index(of: viewController)!
let nextIndex = abs((currentIndex + 1) % pages.count)
return pages[nextIndex]
}
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return pages.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return 0
}
}
持有 PageViewController 的容器 View Controller
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var pageVC: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func buttonAction(_ sender: Any) {
if let page = self.childViewControllers.first as? PageViewController {
let second = storyboard?.instantiateViewController(withIdentifier: "second") as! SecondViewController
page.setViewControllers([second], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
}
}
}
这是我的 FirstViewController,它是 PageViewController 的第一页
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var firstText: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
firstText.becomeFirstResponder()
}
}
第二 View Controller
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var secondText: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
secondText.becomeFirstResponder()
}
}
In this demo keybord not down when user click on next button
关于ios - 保持键盘在多个 View Controller 上可见并专注于每个文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878001/