views:

328

answers:

1

I have a view with several embedded UITextFields, this UIView is subordinated to a UIScrollView in IB. Each text field is supposed to invoke a method called updateText defined in the viewcontroller implementation file when the user is done editing the field. For some reason, the method updateText never gets invoked. Anyone have any ideas how to go about fixing this? The method fired off just fine when the UIScrollView was not present in the project but the keyboard would cover the text fields during input, which was annoying. Now my textfields move up above the keyboard when it appears, but won't fire off the method when done editing.

Here is my implementation file:


#import "MileMarkerViewController.h"


@implementation MileMarkerViewController

@synthesize scrollView,milemarkerLogDate,milemarkerDesc,milemarkerOdobeg,milemarkerOdoend,milemarkerBusiness,milemarkerPersonal,milemarker;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Initialization code
    }
    return self;
}

- (BOOL) textFieldShouldReturn: (UITextField*) theTextField {
    return [theTextField resignFirstResponder];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver: self 
                                             selector: @selector(keyboardWasShown:)
                                                 name: UIKeyboardDidShowNotification 
                                               object: nil];

    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(keyboardWasHidden:)
                                                 name: UIKeyboardDidHideNotification 
                                               object: nil];

    keyboardShown = NO; // 1
    [scrollView setContentSize: CGSizeMake( 320, 480)]; // 2
}


- (void)keyboardWasShown:(NSNotification*)aNotification {
    if (keyboardShown) return;

    NSDictionary* info = [aNotification userInfo];

    // Get the size of the keyboard.
    NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;

    // Resize the scroll view (which is the root view of the window)
    CGRect viewFrame = [scrollView frame];
    viewFrame.size.height -= keyboardSize.height;
    scrollView.frame = viewFrame;

    // Scroll the active text field into view.
    CGRect textFieldRect = [activeField frame];
    [scrollView scrollRectToVisible:textFieldRect animated:YES];

    keyboardShown = YES;
}

- (void)keyboardWasHidden:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];

    // Get the size of the keyboard.
    NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGSize keyboardSize = [aValue CGRectValue].size;

    // Reset the height of the scroll view to its original value
    CGRect viewFrame = [scrollView frame];
    viewFrame.size.height += keyboardSize.height;
    [scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
    scrollView.frame = viewFrame;

    keyboardShown = NO;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    activeField = nil;
}




- (IBAction)updateText:(id) sender {

    NSLog(@"You just entered: %@",self.milemarkerLogDate.text);
    self.milemarker.logdate = self.milemarkerLogDate.text;
    self.milemarker.desc = self.milemarkerDesc.text;
    self.milemarker.odobeg = self.milemarkerOdobeg.text;
    self.milemarker.odoend = self.milemarkerOdoend.text;
    self.milemarker.business = self.milemarkerBusiness.text;
    self.milemarker.personal = self.milemarkerPersonal.text;
    NSLog(@"Original textfield is set to: %@",self.milemarker.logdate);
    [self.milemarker updateText];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)dealloc {
    [super dealloc];
}


@end
A: 

I think you have already known a solution because of post date. You can implement textFieldShouldReturn method and resign first responder from textField in the method.

textFieldDidEndEditing: is called after textField resign first responder.


Masayuki Matsuhisa (@matsu3939)