Итак, у меня есть UITextView, который я использую, чтобы позволить пользователю отправлять текст.
Моя проблема в том, что я не могу понять, как разрешить пользователю "Отменить", удалив из UITextView.
Итак, у меня есть UITextView, который я использую, чтобы позволить пользователю отправлять текст.
Моя проблема в том, что я не могу понять, как разрешить пользователю "Отменить", удалив из UITextView.
Упрощение ответ tuzzolotron: Если в вашем xib правильно подключена следующая розетка
IBOutlet UITextView *myTextView;
Используйте это в контроллере представления:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if ([myTextView isFirstResponder] && [touch view] != myTextView) {
[myTextView resignFirstResponder];
}
[super touchesBegan:touches withEvent:event];
}
Нажмите на представление View Controller View, вне текстового вида, смирится с первым ответчиком, закрыв клавиатуру.
Другой подход, который я использовал много, работая с UITableViews, Searchbar и клавиатурой, я думаю, вы можете применить его к текстовому полю
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
gestureRecognizer.cancelsTouchesInView = NO; // this prevents the gesture recognizers to 'block' touches
[gestureRecognizer release];
И тут, здесь простая функция обратного вызова
- (void)hideKeyboard {
[myTextField resignFirstResponder];
}
Надеюсь, что это поможет
На мой взгляд:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
// pass touches up to viewController
[self.nextResponder touchesBegan:touches withEvent:event];
}
В моем контроллере:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if (keyboardShown && [touch view] != self.TextView)
{
[self.TextView resignFirstResponder];
}
[super touchesBegan:touches withEvent:event];
}
- (void)keyboardWasShown:(NSNotification*)aNotification
{
keyboardShown = YES;
}
Это старый пост, но я реализовал это решение, когда нашел что-то намного проще (возможно, тогда он не был доступен).
[self.myTextView endEditing: YES];
Я использую UITableView, поэтому я помещаю эту строку в метод didSelectRowAtIndexPath:. Пока что так хорошо...
Вот лучшее решение, которое не зависит от выхода и будет работать с любым количеством объектов UITextField в вашем контроллере.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
if (![[touch view] isKindOfClass:[UITextField class]]) {
[self.view endEditing:YES];
}
[super touchesBegan:touches withEvent:event];
}
Очень легко
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
var touch = event.allTouches()?.anyObject() as UITouch
if( textfield.isFirstResponder() && touch.view != textfield) {
textfield.resignFirstResponder()
NSLog("Resigning first responder since touches began outside")
}
super.touchesBegan(touches, withEvent: event)
}
Ответ на ohhorob тоже работал у меня. Здесь простой быстрый эквивалент.
Вот быстрый код
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
if textField.isFirstResponder && touch.view != textField {
textField.resignFirstResponder()
}
}
super.touchesBegan(touches, with: event)
}
Мне нужна версия этого, которая работала для выхода из любого представления, не требуя отдельных точек для каждого из них. Вот мое решение, которое я вложил в один из моих стандартных представлений контейнера.
Он использует MonoTouch С#, хотя должно быть очевидно, как преобразовать его в Objective-C
private void findAndResignFirstResponder(UIView node=null) {
if (node == null) { return; }
if (node.IsFirstResponder) {
node.ResignFirstResponder();
return;
}
foreach (UIView view in node.Subviews) {
findAndResignFirstResponder(node:view);
}
}
private bool haveDrag = false;
public override void TouchesEnded(NSSet touches, UIEvent evt) {
if (!haveDrag) {
UITouch touch = (UITouch)evt.AllTouches.AnyObject;
if (!touch.View.CanBecomeFirstResponder) {
this.findAndResignFirstResponder(this);
Console.WriteLine("resign");
}
}
base.TouchesEnded (touches, evt);
}
public override void TouchesMoved(NSSet touches, UIEvent evt) {
haveDrag = true;
base.TouchesMoved (touches, evt);
}
public override void TouchesBegan(NSSet touches, UIEvent evt) {
haveDrag = false;
base.TouchesBegan (touches, evt);
}
Мой способ сделать это...
Добавьте ссылку на TextView в @interface вашего ViewController:
@property (weak, nonatomic) IBOutlet UITextView *yourTextView;
Переопределите этот метод в @implementation вашего ViewController:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if ([self.yourTextView isFirstResponder]) {
[self.yourTextView resignFirstResponder];
}
}