ios - 保持键盘在多个 View Controller 上可见并专注于每个文本字段

标签 ios swift uitextfield

这是我的 Storyboard目前的样子:onboardingVC 包含嵌入 PageViewControllerUIView Container,它包含对接下来 3 个 ViewControllers 的引用

enter image description here 在 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()
    }
}

This is my storyboard: enter image description here

In this demo keybord not down when user click on next button

关于ios - 保持键盘在多个 View Controller 上可见并专注于每个文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49878001/

相关文章:

javascript - 如何存储和重用click事件(允许播放音频/视频)

swift - 多次获取核心数据

ios - 如何使用 Alamofire 创建 post 方法 cURL 请求来实现 API?

ios - 在 Collection View 中设置图像和名称 swift 5

iphone - 当我的设备自动锁定时获取通知

objective-c - 将 NSString 截断为宽度

ios - 如何在后台运行代码?使用 dispatch_async 它是如何工作的?

iphone - 如何在 uitextfield 中显示 pickerview 而不是键盘?

ios - UITextField 数据未上传到 firebase

ios - 在不使用委托(delegate)方法的情况下检测 UITextView 和/或 UITextField 上的 SELECTION 更改