Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should [UIView endEditing:YES] ever return no?

I am having a hell of a time fixing a bug, which currently is only occurring when I run my app on the simulator. Essentially, I have a UITextView that I am trying to send the message endEditing to. If I send the message while the user is editing the textview (forced or otherwise) I get back YES. If however, the user has not yet begun editing the textview and I send the message endEditing:YES, I get back NO. Should this even be possible? Shouldn't endEditing:YES always force the view to end editing?

Additional Details: I have tried setting the owning class to be the uitextviews delegate, but even then it doesn't look like the shouldEndEditing method even gets called.


UPDATE: It does not seem that this is normal behavior (that the method should return no if the text field is not currently the first responder).

I created a simple test:

AppDelegate.h

#import <UIKit/UIKit.h>

@interface DRAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (assign) IBOutlet UITextView *textView;
@property (assign) IBOutlet UIButton *endButton;
@property (assign) IBOutlet UILabel *results;

-(IBAction)tapEndEditingButton:(id)sender;

@end

and AppDelegate.m

-(void)tapEndEditingButton:(id)sender
{
    BOOL didEndEditing = [self.window endEditing:YES];
    NSString *result = (didEndEditing) ? @"YES" : @"NO";
    _results.text = result;
}

Regardless of whether the textfield has focus, and regardless of whether I set the force parameter of endEditing to YES or NO, didEndEditing gets set to YES.

like image 280
Plastech Avatar asked Dec 03 '25 01:12

Plastech


1 Answers

Check Apple Doc on UIView

endEditing:

Causes the view (or one of its embedded text fields) to resign the first responder status.

...

Return Value

YES if the view resigned the first responder status or NO if it did not.

Discussion

This method looks at the current view and its subview hierarchy for the text field that is currently the first responder. If it finds one, it asks that text field to resign as first responder. If the force parameter is set to YES, the text field is never even asked; it is forced to resign.


So... When you said:

If however, the user has not yet begun editing the textview and I send the message endEditing:YES, I get back NO

It's perfectly fine because in your scenario, since there is no firstResponder to resign, calling -endEditing: will return NO and doesn't harm the performance (isn't a bug either, imho)


To answer the essence of the question:

[UIView endEditing:YES/NO]; will return NO if the specified UIView object was not the firstResponder.

Example:

-(void)testEndEditing
{
    UIButton *btnTest = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnTest setFrame:CGRectMake(0, 130, 320, 44)];
    [btnTest setBackgroundColor:[UIColor blueColor]];
    [btnTest addTarget:self action:@selector(myEndEditing:) 
                  forControlEvents:UIControlEventTouchUpInside];
    [btnTest setTitle:@"End Editing" forState:UIControlStateNormal];
    [self.view addSubview:btnTest];

    UITextField *txtFTest = [[UITextField alloc] init];
    [txtFTest setFrame:CGRectMake(0, 50, 320, 30)];
    [txtFTest setBackgroundColor:[UIColor orangeColor]];
    [txtFTest setText:@"textField"];
    [self.view addSubview:txtFTest];

    /*
    globally declare "UITextView *txtVTest;"
     */
    txtVTest = [[UITextView alloc] init];
    [txtVTest setFrame:CGRectMake(0, 80, 320, 50)];
    [txtVTest setBackgroundColor:[UIColor redColor]];
    [txtVTest setText:@"textView"];
    [self.view addSubview:txtVTest];

    //make UITextField object the firstResponder
    [txtFTest becomeFirstResponder];
}

-(void)myEndEditing:(UIButton *)sender
{
    //test endEditing method on UITextView object
    BOOL isWhat = [txtVTest endEditing:YES];
    NSLog(@"%i",isWhat);
}

PS: If neither the textField nor the textView is the firstResponder then it returns YES (dunno why but i'll check)

like image 178
staticVoidMan Avatar answered Dec 05 '25 13:12

staticVoidMan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!