简体   繁体   中英

UITextfield showing and dismissing very quickly in UIPageViewController (Swift)

I have a UIPageViewController as walkthrough presentation for my app. The walkthrough has basically 5 pages in total. Page 4 has a UITextField programmatically set. Don't mind the other objects like labels or Images.

The problem I have is that when the user reaches page 4, The user is presented with a Textfield which i'd like the keyboard to show up automatically via a becomeFirstResponder .

When I load this 4th view with the textfield, It shows up very quickly on the simulator and on my device and then goes back down. It basically shows up via the becomeFirstResponder code but somehow then resigns within 1 second.

I have tried this programmatically and also via the storyboard UITextfield to see if that made a difference but both seem to not work.

The code that executes a label is where I also executed the UITextField programmatically but for this example, I removed it and used an IBOutlet instead as you can see.

Also, in this case 3 I would put the becomeFirstResponder to activate the keyboard but it still did not work as expected.

Right now I left it in the viewWillAppear method as you can see.

Here is my code for this specific scenario:

 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()
    }

}

}

My question is, how can I remedy this so that when the 4th page is presented in a slide through manner, the UITextfield can present the keyboard like a normal view?

As I saw in a very similar post, This actually worked. I managed to solve it by using this:

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()
        })
    }

 }

Now when I scroll to the 4th page (3rd from 0), It loads the keyboard with the .becomeFirstResponder as a normal UITextField would.

dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{
     [self.yourTextField becomeFirstResponder];
});

For Swift 3:

DispatchQueue.main.async(execute: {() -> Void in
    let strongSelf: WalkthroughViewController = self
    strongSelf. textField.becomeFirstResponder()
})

I didn't have to specify the index position of the ViewController

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM