[UIView endEditing:YES]是否应该返回no?

时间:2014-03-20 17:34:36

标签: ios objective-c uitextview

我有一段时间修复一个错误,目前只有在我在模拟器上运行我的应用程序时才会发生。基本上,我有一个UITextView我试图将消息endEditing发送给。{1}}。如果我在用户编辑textview时发送消息(强制或其他),我会回到YES。但是,如果用户尚未开始编辑textview并发送消息endEditing:YES,则会返回NO。这甚至可能吗?不应该endEditing:YES总是迫使视图结束编辑吗?

其他详细信息:我已经尝试将拥有类设置为uitextviews委托,但即使这样,shouldEndEditing方法也不会被调用。


更新:这似乎不是正常行为(如果文本字段当前不是第一个响应者,则该方法应返回no。)

我创建了一个简单的测试:

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

和AppDelegate.m

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

无论文本字段是否具有焦点,无论我是否将endEditing的force参数设置为YES或NO,都将didEndEditing设置为YES。

1 个答案:

答案 0 :(得分:1)

检查Apple Doc on UIView

  

endEditing:

     

使视图(或其中一个嵌入的文本字段)重新签署第一个响应者状态。

     

...

     

返回值

     

YES如果视图已退出第一响应者状态,或NO如果它已经   不

     

<强>讨论

     

此方法查看当前视图及其子视图层次结构   当前第一个响应者的文本字段。如果找到一个,   它要求文本字段作为第一响应者辞职。如果强制   参数设置为YES,文本字段永远不会被询问;它是   被迫辞职。


所以...当你说:

  

但是,如果用户尚未开始编辑textview,我发送消息endEditing:YES,我返回NO

它非常好,因为在您的方案中,由于没有firstResponder辞职,因此调用-endEditing:将返回NO并且不会损害性能( isn&#39; ta,imho


回答问题的实质:

如果指定的[UIView endEditing:YES/NO];对象不是NO

UIView将返回firstResponder

示例:

-(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:如果textFieldtextView都不是firstResponder,那么它会返回YES dunno为什么,但我会检查