UITextfield 在 UIPageViewController 中快速显示和关闭 (Swift)
UITextfield showing and dismissing very quickly in UIPageViewController (Swift)
我有一个 UIPageViewController
作为我的应用程序的演练演示。演练基本上总共有 5 页。第 4 页以编程方式设置了 UITextField
。不要介意其他对象,如标签或图像。
我遇到的问题是,当用户到达第 4 页时,会向用户显示一个文本字段,我希望键盘通过 becomeFirstResponder
.
自动显示
当我加载带有文本字段的第 4 个视图时,它会非常快速地显示在模拟器和我的设备上,然后返回。它基本上通过 becomeFirstResponder
代码显示,但不知何故会在 1 秒内退出。
我已经以编程方式和故事板 UITextfield
尝试过此操作,以查看是否有所不同,但两者似乎都不起作用。
执行标签的代码也是我以编程方式执行 UITextField
的地方,但对于这个例子,我删除了它并使用了 IBOutlet,如您所见。
此外,在这个 case 3
中,我会使用 becomeFirstResponder
来激活键盘,但它仍然没有按预期工作。
如您所见,我现在将其留在 viewWillAppear
方法中。
这是我针对这个特定场景的代码:
import UIKit
class WalkthroughViewController: UIViewController {
@IBOutlet var headingLabel:UILabel!
@IBOutlet var contentLabel:UILabel!
@IBOutlet var contentImageView:UIImageView!
@IBOutlet var pageControl:UIPageControl!
@IBOutlet var forwardButton:UIButton!
// This was added via storyboard via drag and drop
@IBOutlet var nameField: UITextField!
// This is a UITextfield programmatically
let textField = UITextField(frame: CGRectMake(20, 200.0, 330.0, 40.0)) // x=x-cord, y=y-cord, Width, Height
// May 2 Updates
func textFieldFunc() {
textField.textAlignment = NSTextAlignment.Center
textField.textColor = UIColor.wetAsphaltColor()
textField.backgroundColor = UIColor.whiteColor()
textField.font = UIFont(name: "avenir", size: 21)
textField.borderStyle = UITextBorderStyle.None
textField.autocapitalizationType = UITextAutocapitalizationType.Words // If you need any capitalization
textField.becomeFirstResponder()
self.view.addSubview(textField)
}
func nameLabel() {
let label = UILabel(frame: CGRectMake(15, 180, 265, 33))
label.center = CGPointMake(185, 160)
label.textColor = UIColor.cloudsColor()
label.font = UIFont(name: "avenir", size: 30)
label.textAlignment = NSTextAlignment.Center
label.text = "Whats your name?"
self.view.addSubview(label)
}
@IBAction func submit(sender: AnyObject) {
// Thisis going to handle the name later and it will then reguster the user for later use within the app
}
var index = 0
var heading = ""
var imageFile = ""
var content = ""
override func viewDidLoad() {
super.viewDidLoad()
headingLabel.text = heading
contentLabel.text = content
contentImageView.image = UIImage(named: imageFile)
pageControl.currentPage = index
// 0...2
switch index {
case 0...2: forwardButton.setTitle("NEXT", forState: UIControlState.Normal)
nameField.hidden = true
// 3
case 3:
nameLabel()
nameField.hidden = false
case 4:
forwardButton.setTitle("DONE", forState: UIControlState.Normal)
default: break
}
print("Index: \(index)")
}
@IBAction func nextButtonTapped(sender: UIButton) {
switch index {
case 0...3: // 2
let pageViewController = parentViewController as! WalkthroughPageViewController
pageViewController.forward(index)
case 4: // 3
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setBool(true, forKey: "finishedWalkedThrough")
dismissViewControllerAnimated(true, completion: nil)
default: break
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if nameField.hidden == false {
nameField.becomeFirstResponder()
}
}
}
我的问题是,如何解决这个问题,以便当第 4 页以幻灯片方式显示时,UITextfield
可以像普通视图一样显示键盘?
正如我在一个非常相似的 post 中看到的那样,这确实有效。我设法用这个解决了它:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if index == 3 {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
let strongSelf: WalkthroughViewController = self
strongSelf.textField.becomeFirstResponder()
})
}
}
现在,当我滚动到第 4 页(从 0 开始的第 3 页)时,它会像正常 UITextField
一样使用 .becomeFirstResponder
加载键盘。
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{
[self.yourTextField becomeFirstResponder];
});
对于 Swift 3:
DispatchQueue.main.async(execute: {() -> Void in
let strongSelf: WalkthroughViewController = self
strongSelf. textField.becomeFirstResponder()
})
我不必指定 ViewController
的索引位置
我有一个 UIPageViewController
作为我的应用程序的演练演示。演练基本上总共有 5 页。第 4 页以编程方式设置了 UITextField
。不要介意其他对象,如标签或图像。
我遇到的问题是,当用户到达第 4 页时,会向用户显示一个文本字段,我希望键盘通过 becomeFirstResponder
.
当我加载带有文本字段的第 4 个视图时,它会非常快速地显示在模拟器和我的设备上,然后返回。它基本上通过 becomeFirstResponder
代码显示,但不知何故会在 1 秒内退出。
我已经以编程方式和故事板 UITextfield
尝试过此操作,以查看是否有所不同,但两者似乎都不起作用。
执行标签的代码也是我以编程方式执行 UITextField
的地方,但对于这个例子,我删除了它并使用了 IBOutlet,如您所见。
此外,在这个 case 3
中,我会使用 becomeFirstResponder
来激活键盘,但它仍然没有按预期工作。
如您所见,我现在将其留在 viewWillAppear
方法中。
这是我针对这个特定场景的代码:
import UIKit
class WalkthroughViewController: UIViewController {
@IBOutlet var headingLabel:UILabel!
@IBOutlet var contentLabel:UILabel!
@IBOutlet var contentImageView:UIImageView!
@IBOutlet var pageControl:UIPageControl!
@IBOutlet var forwardButton:UIButton!
// This was added via storyboard via drag and drop
@IBOutlet var nameField: UITextField!
// This is a UITextfield programmatically
let textField = UITextField(frame: CGRectMake(20, 200.0, 330.0, 40.0)) // x=x-cord, y=y-cord, Width, Height
// May 2 Updates
func textFieldFunc() {
textField.textAlignment = NSTextAlignment.Center
textField.textColor = UIColor.wetAsphaltColor()
textField.backgroundColor = UIColor.whiteColor()
textField.font = UIFont(name: "avenir", size: 21)
textField.borderStyle = UITextBorderStyle.None
textField.autocapitalizationType = UITextAutocapitalizationType.Words // If you need any capitalization
textField.becomeFirstResponder()
self.view.addSubview(textField)
}
func nameLabel() {
let label = UILabel(frame: CGRectMake(15, 180, 265, 33))
label.center = CGPointMake(185, 160)
label.textColor = UIColor.cloudsColor()
label.font = UIFont(name: "avenir", size: 30)
label.textAlignment = NSTextAlignment.Center
label.text = "Whats your name?"
self.view.addSubview(label)
}
@IBAction func submit(sender: AnyObject) {
// Thisis going to handle the name later and it will then reguster the user for later use within the app
}
var index = 0
var heading = ""
var imageFile = ""
var content = ""
override func viewDidLoad() {
super.viewDidLoad()
headingLabel.text = heading
contentLabel.text = content
contentImageView.image = UIImage(named: imageFile)
pageControl.currentPage = index
// 0...2
switch index {
case 0...2: forwardButton.setTitle("NEXT", forState: UIControlState.Normal)
nameField.hidden = true
// 3
case 3:
nameLabel()
nameField.hidden = false
case 4:
forwardButton.setTitle("DONE", forState: UIControlState.Normal)
default: break
}
print("Index: \(index)")
}
@IBAction func nextButtonTapped(sender: UIButton) {
switch index {
case 0...3: // 2
let pageViewController = parentViewController as! WalkthroughPageViewController
pageViewController.forward(index)
case 4: // 3
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setBool(true, forKey: "finishedWalkedThrough")
dismissViewControllerAnimated(true, completion: nil)
default: break
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if nameField.hidden == false {
nameField.becomeFirstResponder()
}
}
}
我的问题是,如何解决这个问题,以便当第 4 页以幻灯片方式显示时,UITextfield
可以像普通视图一样显示键盘?
正如我在一个非常相似的 post 中看到的那样,这确实有效。我设法用这个解决了它:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if index == 3 {
dispatch_async(dispatch_get_main_queue(), {() -> Void in
let strongSelf: WalkthroughViewController = self
strongSelf.textField.becomeFirstResponder()
})
}
}
现在,当我滚动到第 4 页(从 0 开始的第 3 页)时,它会像正常 UITextField
一样使用 .becomeFirstResponder
加载键盘。
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{
[self.yourTextField becomeFirstResponder];
});
对于 Swift 3:
DispatchQueue.main.async(execute: {() -> Void in
let strongSelf: WalkthroughViewController = self
strongSelf. textField.becomeFirstResponder()
})
我不必指定 ViewController
的索引位置