Как позволить пользователю нажать клавишу NEXT и перейти к следующему `UITextField` в ScrollView - PullRequest
2 голосов
/ 29 мая 2011

У меня есть несколько UITextFields, моя клавиатура имеет клавишу «NEXT» в качестве клавиши возврата. Я бы хотел, чтобы пользователь нажал СЛЕДУЮЩУЮ клавишу и перешел к следующему UITextField. Я читал в Интернете, что лучший способ сделать это - реализовать функцию:

-(BOOL)textFieldShouldReturn:(UITextField *)textField

Я сделал это, но у меня это не работает.

Пожалуйста, смотрите мой .m файл

#import "customerInfoViewController.h"

@implementation customerInfoViewController
@synthesize infoModel;

@synthesize Name;
@synthesize AptNum;
@synthesize Street1;
@synthesize Street2;
@synthesize City;
@synthesize Telephone;
@synthesize Email1;


@synthesize textFieldBeingEdited;
@synthesize scrollView;
@synthesize doneButton; 

CartSingleton *Cart;
//==============================================================================
-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:nil/*self.view.window*/];
    [super viewWillAppear:animated];
    Cart = [CartSingleton getSingleton];


}
//==============================================================================
-(void)viewWillDisappear:(BOOL)animated
{
    NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                    name:UIKeyboardWillShowNotification 
                                                  object:nil];
    [super viewWillDisappear:animated];

}
//==============================================================================
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    textFieldBeingEdited = textField;
}
//==============================================================================
-(IBAction)textFieldDoneEditing:(id)sender
{
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    textFieldBeingEdited = NULL;
    [sender resignFirstResponder];
    if (moveViewUp) 
       {
        [self scrollTheView:NO];
       }

}
//==============================================================================
-(BOOL)textFieldShouldReturn:(UITextField *)textField 
{
    NSLog(@"TextField tag is, %d ", textField.tag);
if ([self.Name isFirstResponder]) 
   {
    [self.AptNum becomeFirstResponder];
   }
if ([self.AptNum isFirstResponder]) 
   {
    [self.Street1 becomeFirstResponder];
   }
if ([self.Street1 isFirstResponder])
   {
    [self.Street2 becomeFirstResponder];
   }
if ([self.Street2 isFirstResponder])
   {
    [self.City becomeFirstResponder];
   }
if ([self.City isFirstResponder])
   {
    [self.Telephone becomeFirstResponder];
   }
if ([self.Telephone isFirstResponder])
   {
    [self.Email1 becomeFirstResponder];
   }
if ([self.Email1 isFirstResponder])
   {
    [self.Email1 resignFirstResponder];
   }
return YES;
}
//==============================================================================
-(void)keyboardWillShow:(NSNotification *)notif
{

    NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
NSDictionary *info = [notif userInfo];
NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
//NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
float bottomPoint = (textFieldBeingEdited.frame.origin.y + textFieldBeingEdited.frame.size.height /*+ 20*/);
scrollAmount = keyboardSize.height - (self.view.frame.size.height- bottomPoint);
/*
 CGRect viewFrame = self.view.frame;
 viewFrame.size.height += keyboardSize.height;
 scrollView.frame = viewFrame;
 */
if(scrollAmount > 0)
   {
    moveViewUp = YES;
    [self scrollTheView:YES];
   }
else 
   {
    moveViewUp = NO;
   }

}
//==============================================================================
-(void)scrollTheView:(BOOL)movedUp
{
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    CGRect rect = self.view.frame;
    if(movedUp)
       {
        rect.origin.y -=scrollAmount;
       }
    else 
       {
        rect.origin.y +=scrollAmount;
       }
    self.view.frame = rect;
    [UIView commitAnimations];
}


//==============================================================================
- (void)viewDidLoad 
{
    [super viewDidLoad];
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);

    scrollView.contentSize = self.view.frame.size;

    textFieldBeingEdited = NULL;
    //If there is already 
    if (Cart.customerInfoObtained)
       {
        self.Name.text = Cart.customerInfo.Name;
        self.AptNum.text = Cart.customerInfo.AptNo;
        self.Street1.text = Cart.customerInfo.Street1;
        self.Street2.text = Cart.customerInfo.Street2;
        self.City.text = Cart.customerInfo.City;
        self.Telephone.text = Cart.customerInfo.Tel;
        self.Email1.text = Cart.customerInfo.Email;     
       }

}

//==============================================================================
-(IBAction)doneButtonPressed
{
    NSLog(@"Done button pressed ");
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    [self dismissModalViewControllerAnimated:YES];
    /*
    infoModel = [[customerInfoModel alloc] initWithObjects:self.Name.text
                                                     AptNo:self.AptNum.text
                                                   Street1:self.Street1.text
                                                   Street2:self.Street2.text
                                                      City:self.City.text
                                                       Tel:self.Telephone.text
                                                     Email:self.Email1.text]; 


    [Cart addCustomerInfo:infoModel];
    [self.navigationController popViewControllerAnimated:YES];
    */
}


//==============================================================================
- (void)didReceiveMemoryWarning 
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);

    // Release any cached data, images, etc. that aren't in use.
}
//==============================================================================
- (void)viewDidUnload 
{
    [super viewDidUnload];
        NSLog(@"%s %d %s", __FILE__, __LINE__, __FUNCTION__);
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
//==============================================================================

- (void)dealloc 
{
    NSLog(@"deallocating %@",self);
    [scrollView release];
    [super dealloc];
}
//==============================================================================

@end

Я пошагово выполняю функцию:

-(BOOL)textFieldShouldReturn:(UITextField *)textField 

а вот и консольный вывод

TextField tag is, 6 
[customerInfoViewController textFieldDidBeginEditing:]

[customerInfoViewController textFieldDidBeginEditing:]

[customerInfoViewController textFieldDidBeginEditing:]

[customerInfoViewController textFieldDidBeginEditing:]

[customerInfoViewController textFieldDidBeginEditing:]

[customerInfoViewController textFieldDidBeginEditing:]

Ответы [ 3 ]

2 голосов
/ 22 августа 2012

Это работает для меня:

- (BOOL) textFieldShouldReturn:(UITextField *)textField {    // called when "Next" is pressed
    NSLog(@"textFieldShouldReturn");
    if (textField == nameField) {
        [streetAddressField becomeFirstResponder];
    } else if (textField == streetAddressField) {
        [cityField becomeFirstResponder];
    } else if (textField == cityField) {
        [stateField becomeFirstResponder];
    } else if (textField == stateField) {
        [zipField becomeFirstResponder];
    }
    return YES;
}
2 голосов
/ 15 августа 2013

Шаги:

1) Соответствует UITextFieldDelegate

 @interface ViewControllerTest :UIViewController<UITextFieldDelegate>

@property (weak, nonatomic) IBOutlet UITextField *txtUserId;
@property (weak, nonatomic) IBOutlet UITextField *txtPassword;

@end

2) Назначить делегат текстового поля текущему контроллеру вида

 - (void)viewDidLoad
{
  [super viewDidLoad];


  self.txtUserId.delegate=self;

  self.txtUserId.tag=1;


  self.txtPassword.delegate=self;

  self.txtPassword.tag=2;
 }

3) Реализовать метод textFieldShouldReturn

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
  if(textField.tag==1)
  {
     [self.txtPassword becomeFirstResponder];
  }

  return TRUE;
}
2 голосов
/ 29 мая 2011

Соедините вещи, во-первых, если сначала не запускается -(BOOL)textFieldShouldReturn:(UITextField *)textField, убедитесь, что в текстовых полях есть что-то вроде name.delegate = self;

Во-вторых, если курсор перемещается в следующее поле, вам нужно будет ввести

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

Кроме того, если часть экрана прокрутки находится ниже клавиатуры при отображении клавиатуры, вы захотите уменьшить высоту экрана прокрутки, чтобы клавиатура не перекрывалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...