How do I get a UITextField to accept focus without showing the keyboard? - objective-c

I am trying to find a way to prevent the keyboard from appearing when the user taps on a TextField but could`t find a way to do it.
I tried this code after I linked my textField to delegate and still it did not work for me, the code was logging but the keyboard did appear.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
NSLog(#"BeginEditing");
return YES;
[textField resignFirstResponder];
}
When I return with NO I lose the focus from the textField, which I need.
The textFields I have are filled with values from a buttons on the same view, thats why I don't want the keyboard to appear, and at the same time I want the user to select the textField they want to fill.

if you just want user to select the textfield to fill and does not want to keyboard to show up then you can do the following:
add tag to your textfields
change the code to this:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
selectedTextFieldTag = textField.tag;
return NO;
}
use selectedTextField value to identify which textfield to fill in your code. return NO will not allow keyboard to appear.

This will help you for sure.
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField {
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
activeField.inputView = dummyView; // Hide keyboard, but show blinking cursor
return YES;
}
I tested and it is working for me. Hope this will be useful for others who have similar issue.

[textField resignFirstResponder]; will not be called because you are returning from the method before it can get called. Does that not fire a warning?
Try returning NO here or if that doesn't work, try disabling user-interaction on the text field:
[myTextField setUserInteractionEnabled:NO];

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
NSLog(#"BeginEditing");
[textField resignFirstResponder];
return YES;
}

so here you just use flag int variable to assign the value to focused textfield
define int i; flag globally in .h or .m file
after that in textField Delegate method use bellow code...
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
if (textField == yourtextField1 ) {
i=1;
}
else if (textField == yourtextField2 ) {
i=2;
}
else if (textField == yourtextField3 ) {
i=3;
}
else if (textField == yourtextField4 ) {
i=4;
}
return NO;
}
-(IBAction)yourbutton1_Clicked:(id)sender{
if( i == 1){
yourtextField1.text=yourbutton1.titleLabel.text;
}
else if ( i == 2){
yourtextField2.text=yourbutton1.titleLabel.text;
}
else if ( i == 3){
yourtextField3.text=yourbutton1.titleLabel.text;
}
else if ( i == 4){
yourtextField4.text=yourbutton1.titleLabel.text;
}
else{
NSLog(#"Please Click On TextField");//here you can put AlertView Message
}
}
and so on.......
also you can use common method with sender id of button and also tag......

Related

textBox is not firstResponder even though it is the only textBox I have picked

As soon as I run the program, I select the first textBox and then select a second textBox. fNameDone runs when textBox 1 touchUpOutside.The NSLogs are there to check if the textbox is the first responder and both nslogs return false. But it is the only textBox I have picked. My ultimate goal is to have each text box I pick, the keyboard goes away when I touchUpOutside.
- (IBAction)fNameDone:(id)sender
{
if([_firstName isEditing])
NSLog(#"True");
else
NSLog(#"False");
[self.view endEditing:TRUE];
if([_firstName isEditing])
NSLog(#"True");
else
NSLog(#"False");
}
Try this (there is no textbox in iOS I think you mean TextField)
- (BOOL)textFieldShouldReturn:(UITextField*)aTextField
{
if(aTextField.tag == 100){
[pickerView setHidden:YES];
return NO;
}
[aTextField resignFirstResponder];
return YES;
}
Don't forgot to set the delegate of textfield
EDIT:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if(aTextField.tag == 100){
firstField.inputVIew = pickerView ;
}
}

get into a second line in uitextview, UITextView, ios

My view is containing :
first name ( UITextField )
last name ( UITextField )
email ( UITextField )
note ( UITextView )
picture is following
The codes below is used to handle when you enter a return key
- (BOOL)textFieldShouldReturn:(UITextField *)textField { // invoked when user hits return of keyboard from a text field
if ( textField == self.firstName)
[self.lastName becomeFirstResponder];
else if (textField == self.lastName)
[self.email becomeFirstResponder];
else if (textField == self.email) {
[self.note becomeFirstResponder];
}
return YES;
}
When I am at email field and hit next, I am landing at note but at the second line like following ( the light blue cursor is at a second line )
I dont get it. Should the cursor be at the first line of the note .
Any idea about this issue ?
I am still not sure whether the following peace of code works for you(sorry for that)...but give a try...
By Changing the curson location:
notetextView.editable = YES;
notetextView.selectedRange = NSMakeRange(2, 0);//i have put in as 2,you can change the location based on your requirent.
Your issue looks strange,and have upvoted your question,so that others can answer,if the above code won't work you...
write return NO when email text is return.
Try this code.
- (BOOL)textFieldShouldReturn:(UITextField *)textField { // invoked when user hits return of keyboard from a text field
if ( textField == self.firstName)
[self.lastName becomeFirstResponder];
else if (textField == self.lastName)
[self.email becomeFirstResponder];
else if (textField == self.email) {
[self.note becomeFirstResponder];
return NO;
}
return YES;
}

Change UITextField background when editing begins for multiple fields

So I found this thread a while ago:
Change UITextField background when editing begins
The top answer is a fantastic resource for changing the background image of a textField when the user edits it. However, my issue is, how can you enable this with MULTIPLE text fields?
Specifically (for my app) I have a login and password field. Using the code I'll post below I can get my first text field to change images correctly when the user taps it. However, I cannot get the next field to follow suit when the user taps either the next text field or the "Next" option on the keyboard. As you can only have one instance of "textFieldShouldBeginEditing" as well as ending, you need to set the code for image change for both fields under the same section. however, when I do this, both my fields change when the first field is tapped, and both restore when the second is tapped.
Any ideas on this one excellent community?
Here's some code:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
_userNameTextField.background = [UIImage imageNamed:#"login_field_highlighted#2x"];
return YES;
_passwordTextField.background = [UIImage imageNamed:#"password_field_highlighted#2x"];
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
_userNameTextField.background = [UIImage imageNamed:#"login_field#2x"];
return YES;
_passwordTextField.background = [UIImage imageNamed:#"password_field#2x"];
return YES;
}
- (BOOL) textFieldShouldReturn:(UITextField *)textField {
NSLog(#"textFieldShouldReturn");
if (textField == _userNameTextField) {
[_passwordTextField becomeFirstResponder];
} else if (textField == _passwordTextField) {
[_passwordTextField resignFirstResponder];
}
return YES;
}
In each of those methods, you just need to check to see which textfield is targeted, just like you did in textFieldShouldReturn:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
if (textField == _userNameTextField) {
_userNameTextField.background = [UIImage imageNamed:#"login_field#2x"];
} else if (textField == _passwordTextField) {
_passwordTextField.background = [UIImage imageNamed:#"password_field#2x];
}
return YES;
}

navigate through textfields

I'm trying to use the #PeyloW code that I found here How to navigate through textfields (Next / Done Buttons) but when I press the keyboard return button nothing happens. My tags are ok.
Header:
- (BOOL)textFieldShouldReturn:(UITextField*)textField;
Implementation:
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
NSInteger nextTag = textField.tag + 1;
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
[nextResponder becomeFirstResponder];
} else {
[textField resignFirstResponder];
}
return NO;
}
What am I missing? My keyboard doesn't have next done, only return. Keep in mind that I'm very new to iOS.
EDIT:
I tried to debug the code by adding a breakpoint to it and the code isn't being triggered.
I don't like solutions that incorporate the tag. Instead I would put all inputfileds in the desired order into an array and in -textFieldShouldReturn: use the given textfield to get it's index from in the array. Then I would get the object at that index.
- (BOOL)textFieldShouldReturn:(UITextField*)textField {
NSUInteger nextIndex = [arrayWithResponders indexOfObject:textField]+1 % [arrayWithResponders count];
UIResponder* nextResponder = [arrayWithTextFields objectAtIndex: nextIndex];
if (nextResponder) {
[nextResponder becomeFirstResponder];
} else {
[textField resignFirstResponder];
}
return NO;
}
You just added, that the breakpoints aren't triggered, so most likely you didn't set up the delegate.

Moving Onto The Next UITextField When 'Next' Is Tapped

I have an iPad application which has a sign up form within it. The form is very basic and contains only two UITextFields which are for Name & Email address.
The first TextField is for the candidates Name, When they enter their name in and press 'Next' on the keyboard I want this to automatically move to the next Email Address TextField to editing.
Any idea how I can set the next button the keyboard to jump to the next keyboard?
Thanks
You need to make your view controller the UITextField delegate, and implement the UITextField delegate method:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == nameField) {
[textField resignFirstResponder];
[emailField becomeFirstResponder];
} else if (textField == emailField) {
// here you can define what happens
// when user presses return on the email field
}
return YES;
}
Swift version:
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == nameField {
textField.resignFirstResponder()
emailField.becomeFirstResponder()
} else if textField == emailField {
// here you can define what happens
// when user presses return on the email field
}
return true
}
You may also want to scroll your view for the emailField to become visible. If your view controller is an instance of UITableViewController, this should happen automatically. If not, you should read this Apple document, especially Moving Content That Is Located Under the Keyboard part.
Additionally to #lawicko 's answer I often change the button text to give that final finishing touch (e.g. says next when there are more fields and then done when on the last):
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
BOOL isLastTextField = //.. your logic to figure out if the current text field is the last
if (isLastTextField) {
textField.returnKeyType = UIReturnKeyDone;
} else {
textField.returnKeyType = UIReturnKeyNext;
}
}
Swift version of correct answer.
In my experience, you do not need to resignFirstResponder when switching textFields.
In this example, it's just your basic username and password textFields.
The keyboard "return key" in storyboard for username is set to "Next" and the one for password is set to "Done".
Then just connect the delegates for these two text fields and add this extension and you're pretty much done.
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
if textField == textFieldPassword {
self.view.endEditing(true)
} else {
textFieldPassword.becomeFirstResponder()
}
return true
}
}
A more consistent and robust way is to use NextResponderTextField
You can configure it totally from interface builder.
All you need to do is
Set the class type of your UITextField to be NextResponderTextField
Then set the outlet of the nextResponderField to point to the next responder it can be anything UITextField or any UIResponder subclass. It can be also a UIButton and the library is smart enough to trigger the TouchUpInside event of the button only if it's enabled.
Here is the library in action:
A Swift 4 extension. Just pass the array of UITextFields and it will connect each one to the next until the last one which resigns the first responder (hides the keyboard):
extension UITextField {
class func connectFields(fields: [UITextField]) {
guard let last = fields.last else { return }
// To reset the targets in case you call this method again to change the connected fields
fields.forEach { $0.removeTarget(nil, action: nil, for: .editingDidEndOnExit) }
for i in 0 ..< fields.count - 1 {
fields[i].returnKeyType = .next
fields[i].addTarget(fields[i + 1], action: #selector(UIResponder.becomeFirstResponder), for: .editingDidEndOnExit)
}
last.returnKeyType = .continue
last.addTarget(last, action: #selector(UIResponder.resignFirstResponder), for: .editingDidEndOnExit)
}
}
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
if (textField == self.textFieldName)
{
[self.textFieldName resignFirstResponder];
[self.textFieldPassword becomeFirstResponder];
}
else if (textField == self.textFieldPassword)
{
[self.textFieldPassword resignFirstResponder];
[self login:self];
}
return true;
}
#interface MLLoginViewController ()<UITextFieldDelegate>
#end
#implementation MLLoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textFieldName.delegate = self;
self.textFieldPassword.delegate = self;
Make an outlet for the textfield, then
viewController.h
(IBAction)textFieldDoneEditing:(id)sender;
viewController.m
(IBAction)textFieldDoneEditing:(id)sender {
[textField resignFirstResponder];
if (textField == nameField) {
[emailField becomeFirstResponder];
}
}
Make the relation between (show the connections inspector > Sent Events)didEndOnExit and textFieldDoneEditing