react-native/React/Views/RCTTextField.m

132 lines
3.9 KiB
Mathematica
Raw Normal View History

/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
2015-01-30 01:10:49 +00:00
#import "RCTTextField.h"
#import "RCTConvert.h"
#import "RCTEventDispatcher.h"
2015-01-30 01:10:49 +00:00
#import "RCTUtils.h"
#import "UIView+React.h"
2015-01-30 01:10:49 +00:00
@implementation RCTTextField
{
RCTEventDispatcher *_eventDispatcher;
2015-01-30 01:10:49 +00:00
NSMutableArray *_reactSubviews;
BOOL _jsRequestingFirstResponder;
}
- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher
2015-01-30 01:10:49 +00:00
{
if ((self = [super initWithFrame:CGRectZero])) {
2015-01-30 01:10:49 +00:00
_eventDispatcher = eventDispatcher;
[self addTarget:self action:@selector(_textFieldDidChange) forControlEvents:UIControlEventEditingChanged];
[self addTarget:self action:@selector(_textFieldBeginEditing) forControlEvents:UIControlEventEditingDidBegin];
2015-01-30 01:10:49 +00:00
[self addTarget:self action:@selector(_textFieldEndEditing) forControlEvents:UIControlEventEditingDidEnd];
[self addTarget:self action:@selector(_textFieldSubmitEditing) forControlEvents:UIControlEventEditingDidEndOnExit];
_reactSubviews = [[NSMutableArray alloc] init];
}
return self;
}
- (NSArray *)reactSubviews
{
// TODO: do we support subviews of textfield in React?
// In any case, we should have a better approach than manually
// maintaining array in each view subclass like this
2015-01-30 01:10:49 +00:00
return _reactSubviews;
}
- (void)removeReactSubview:(UIView *)subview
{
// TODO: this is a bit broken - if the TextField inserts any of
// its own views below or between React's, the indices won't match
2015-01-30 01:10:49 +00:00
[_reactSubviews removeObject:subview];
[subview removeFromSuperview];
}
- (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex
{
// TODO: this is a bit broken - if the TextField inserts any of
// its own views below or between React's, the indices won't match
2015-01-30 01:10:49 +00:00
[_reactSubviews insertObject:view atIndex:atIndex];
[super insertSubview:view atIndex:atIndex];
}
- (CGRect)caretRectForPosition:(UITextPosition *)position
{
if (_caretHidden) {
return CGRectZero;
}
return [super caretRectForPosition:position];
}
- (CGRect)textRectForBounds:(CGRect)bounds
{
CGRect rect = [super textRectForBounds:bounds];
return UIEdgeInsetsInsetRect(rect, _contentInset);
2015-01-30 01:10:49 +00:00
}
- (CGRect)editingRectForBounds:(CGRect)bounds
{
return [self textRectForBounds:bounds];
}
- (void)setAutoCorrect:(BOOL)autoCorrect
{
self.autocorrectionType = (autoCorrect ? UITextAutocorrectionTypeYes : UITextAutocorrectionTypeNo);
2015-01-30 01:10:49 +00:00
}
- (BOOL)autoCorrect
{
return self.autocorrectionType == UITextAutocorrectionTypeYes;
}
#define RCT_TEXT_EVENT_HANDLER(delegateMethod, eventName) \
- (void)delegateMethod \
{ \
[_eventDispatcher sendTextEventWithType:eventName \
reactTag:self.reactTag \
text:self.text]; \
2015-01-30 01:10:49 +00:00
}
RCT_TEXT_EVENT_HANDLER(_textFieldDidChange, RCTTextEventTypeChange)
RCT_TEXT_EVENT_HANDLER(_textFieldBeginEditing, RCTTextEventTypeFocus)
RCT_TEXT_EVENT_HANDLER(_textFieldEndEditing, RCTTextEventTypeEnd)
RCT_TEXT_EVENT_HANDLER(_textFieldSubmitEditing, RCTTextEventTypeSubmit)
2015-01-30 01:10:49 +00:00
// TODO: we should support shouldChangeTextInRect (see UITextFieldDelegate)
2015-01-30 01:10:49 +00:00
- (BOOL)becomeFirstResponder
{
_jsRequestingFirstResponder = YES; // TODO: is this still needed?
BOOL result = [super becomeFirstResponder];
2015-01-30 01:10:49 +00:00
_jsRequestingFirstResponder = NO;
return result;
2015-01-30 01:10:49 +00:00
}
- (BOOL)resignFirstResponder
{
BOOL result = [super resignFirstResponder];
if (result)
{
[_eventDispatcher sendTextEventWithType:RCTTextEventTypeBlur
reactTag:self.reactTag
text:self.text];
}
return result;
2015-01-30 01:10:49 +00:00
}
- (BOOL)canBecomeFirstResponder
{
return _jsRequestingFirstResponder;
}
@end