这是我的 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/
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上找到一个类似的问题
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一个具有一些属性的模型: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
我正在尝试修改当前依赖于定义为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之间的所有版本,你可以这
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust