jjzjj

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

coder 2023-09-16 原文

这是我的 Storyboard目前的样子:onboardingVC 包含嵌入 PageViewControllerUIView 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()
    }
}

This is my storyboard:

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

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

有关ios - 保持键盘在多个 View Controller 上可见并专注于每个文本字段的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  6. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  7. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  8. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 即时确定方法的可见性 - 2

    我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust

随机推荐