Jak zamknąć klawiaturę dla UITextView za pomocą klawisza return?

W bibliotece IB, wprowadzenie mówi nam, że po naciśnięciu klawisza return, klawiatura UITextView zniknie. Ale w rzeczywistości Klucz return może działać tylko jako '\n'.

Mogę dodać przycisk i użyć [txtView resignFirstResponder], aby ukryć klawiaturę.

Ale czy jest sposób na dodanie akcji dla klawisza return w klawiaturze, żebym nie musiał dodawać UIButton?

Author: swiftBoy, 2009-04-01

30 answers

UITextView nie posiada żadnych metod, które zostaną wywołane, gdy użytkownik naciśnie klawisz return. Jeśli chcesz, aby użytkownik mógł dodać tylko jeden wiersz tekstu, użyj UITextField. Naciśnięcie klawisza return i ukrycie klawiatury UITextView nie postępuje zgodnie z wytycznymi interfejsu.

Nawet wtedy, jeśli chcesz to zrobić, zaimplementuj metodę textView:shouldChangeTextInRange:replacementText: z UITextViewDelegate i sprawdź, czy tekst zastępczy to \n, ukryj klawiaturę.

Mogą być inne sposoby, ale nie jestem tego świadoma.
 330
Author: lostInTransit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 06:15:10

Pomyślałem, że zamiast tego wrzucę fragment tutaj:

Upewnij się, że zadeklarowałeś wsparcie dla UITextViewDelegate Protokołu.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Swift 4.0 update:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}
 468
Author: samvermette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-12 15:43:02

Wiem, że już na to odpowiedziałam, ale nie lubię używać znaków literalnych dla nowej linii, więc oto, co zrobiłem.

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

Swift 4.0 update:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}
 71
Author: ribeto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 04:47:54

Wiem, że wiele razy na to odpowiadano, ale oto moje dwa grosze na ten temat.

Znalazłem odpowiedzi samvermette i ribeto naprawdę przydatne, a także komentarz maxpower w odpowiedzi ribeto {5]}. Ale jest problem z tymi podejściami. Problem, który matt wspomina w odpowiedzi samvermette i polega na tym, że jeśli użytkownik chce wkleić coś z przerwaniem linii w środku, klawiatura ukryje bez wklejania czegokolwiek.

Więc moje podejście jest mieszanką trzech wyżej wymienionych rozwiązań i tylko sprawdzanie, czy wprowadzony ciąg jest nową linią, gdy długość łańcucha wynosi 1, więc upewniamy się, że użytkownik pisze zamiast wklejać.

Oto co zrobiłem:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}
 40
Author: josebama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Bardziej eleganckim sposobem jest odrzucenie klawiatury, gdy użytkownik dotknie gdzieś poza ramką klawiatury.

Najpierw ustaw widok ViewController na klasę "UIControl" w Inspektorze tożsamości w Uibuilderze. Control-przeciągnij widok do pliku nagłówkowego Viewcontrollera i połącz go jako akcję ze zdarzeniem Touch Up Inside, na przykład:

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

W głównym pliku ViewController, ViewController.m:

-(IBAction)dismissKeyboardOnTap:(id)sender
    {
         [[self view] endEditing:YES];
    }

Możesz wymagać podwójne dotknięcie lub długie dotknięcie przy użyciu podobnych technik. Może być konieczne ustawienie ViewController jako UITextViewDelegate i podłączenie TextView do ViewController. Ta metoda działa zarówno dla UITextView jak i UITextField.

Źródło: Big Nerd Ranch

EDIT: chciałbym również dodać, że jeśli używasz UIScrollView, powyższa technika może nie działać tak łatwo przez konstruktora interfejsu. W takim przypadku możesz użyć UIGestureRecognizer i wywołać [[self view] endEditing: YES] method within it instead. Przykładem może być:

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
}

Gdy użytkownik dotknie poza klawiaturą i nie dotknie przestrzeni wejściowej, klawiatura zostanie odrzucona.

 35
Author: TMilligan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-24 21:24:01

Dodaj tę metodę do kontrolera widoku.

Swift :

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

Ta metoda może być również pomocna dla Ciebie:

/**
Dismiss keyboard when tapped outside the keyboard or textView

:param: touches the touches
:param: event   the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}
 31
Author: Alexander Volkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 07:43:46
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"])
        [textView resignFirstResponder];
    return YES;
}

yourtextView.delegate=self;

Dodaj również UITextViewDelegate

Nie zapomnij potwierdzić protokołu

Jeśli nie dodałeś if([text isEqualToString:@"\n"]) nie możesz edytować

 25
Author: Vineesh TP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:55:49

Istnieje inne rozwiązanie podczas korzystania z uitextview, Możesz dodać pasek narzędzi jako InputAccessoryView w "textViewShouldBeginEditing", a z tego paska narzędziowego przycisku Gotowe możesz zamknąć klawiaturę, kod do tego jest następujący:

In viewDidLoad

toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];

W metodzie textviewdelegate

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
     [textView setInputAccessoryView:toolBar];
     return YES;
}

W akcji przycisku Done, który znajduje się w pasku narzędzi jest następujący:

-(IBAction)btnClickedDone:(id)sender
{
    [self.view endEditing:YES];
}
 13
Author: g212gs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 08:14:15

Znalazłem odpowiedź josebama jako najbardziej kompletną i czystą odpowiedź dostępną w tym wątku.

Poniżej znajduje się składnia Swift 3:

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.characters.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}
 6
Author: Puneet Kohli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 10:43:10

Podobnie jak matt komentuje samvermette, nie podoba mi się też pomysł wykrywania "\n". Klucz "return" znajduje się w UITextView z jakiegoś powodu, czyli oczywiście przejść do następnej linii.

Moim zdaniem najlepszym rozwiązaniem jest naśladowanie aplikacji iPhone message - czyli dodanie paska narzędzi (i przycisku) na klawiaturze.

Otrzymałem kod z następującego wpisu na blogu:

Http://www.iosdevnotes.com/2011/02/iphone-keyboard-toolbar/

Kroki:

- Dodaj pasek narzędzi do swojego Plik XIB-Ustaw wysokość na 460

- Dodaj element przycisku paska narzędzi (jeśli nie został dodany). Jeśli chcesz wyrównać go do prawej, Dodaj element przycisku elastycznego paska do XIB i przesuń element przycisku paska narzędzi

- Utwórz akcję, która połączy twój element przycisku z resignFirstResponder w następujący sposób:

- (IBAction)hideKeyboard:(id)sender {
    [yourUITextView resignFirstResponder];
}

-wtedy:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}
 5
Author: friend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-21 00:21:25

Po prostu rozwiązałem ten problem w inny sposób.

  • Utwórz przycisk, który będzie umieszczony w tle
  • z Inspektora atrybutów Zmień typ przycisku na niestandardowy, a przycisk będzie przezroczysty.
  • rozwiń przycisk, aby pokryć cały widok i upewnij się, że Przycisk znajduje się za wszystkimi innymi obiektami. Łatwo to zrobić, przeciągając przycisk na górę widoku listy w widoku
  • Sterowanie przeciągnij przycisk do pliku viewController.h i utwórz akcja (wysłane Zdarzenie: Touch Up Inside) jak:

    (IBAction)ExitKeyboard:(id)sender;
    
  • W ViewController.m powinno wyglądać tak:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
    
  • Uruchom aplikację, a po kliknięciu z dala od widoku tekstowego klawiatura znika
 5
Author: Uvichy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 10:26:51

Dodaj obserwatora w viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

A następnie użyj selektora, aby sprawdzić "\N "

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

Używa "\n " i nie sprawdza konkretnie klucza zwrotnego, ale myślę, że jest to OK.

UPDATE

Zobacz odpowiedź ribto poniżej, która używa [NSCharacterSet newlineCharacterSet] zamiast \n

 5
Author: ToddB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 18:37:57

Używanie kontrolera Nawigacyjnego do obsługi paska do zwalniania klawiatury:

W .plik h:

UIBarButtonItem* dismissKeyboardButton;

W .plik m:

- (void)viewDidLoad {
    dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
}

-(void)textViewDidBeginEditing:(UITextView *)textView {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
    [self.textView resignFirstResponder];
    //or replace this with your regular right button
    self.navigationItem.rightBarButtonItem = nil;
}
 5
Author: Alex Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:53:13

Spróbuj tego:

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}
 4
Author: Nabil El,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-09 09:37:45

/ / możesz tego użyć ...

Krok 1. Pierwszym krokiem jest upewnienie się, że deklarujesz wsparcie dla protokołu UITextViewDelegate. Odbywa się to w pliku nagłówkowym, jako przykład tutaj jest nagłówek o nazwie

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end
Krok 2. Następnie musisz zarejestrować kontroler jako delegata UITextView. Kontynuując z powyższego przykładu, oto jak zainicjalizowałem UITextView z {[5] } jako delegata ...
- (id) init {
    if (self = [super init]) {
        // define the area and location for the UITextView
        CGRect tfFrame = CGRectMake(10, 10, 300, 100);
        messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
        // make sure that it is editable
        messageTextView.editable = YES;

        // add the controller as the delegate
        messageTextView.delegate = self;
    }
Krok 3. A teraz ostatni kawałek puzzle ma podjąć działania w odpowiedzi na wiadomość shouldCahngeTextInRange w następujący sposób:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
  replacementText:(NSString *)text
{
    // Any new character added is passed in as the "text" parameter
    if ([text isEqualToString:@"\n"]) {
        // Be sure to test for equality using the "isEqualToString" message
        [textView resignFirstResponder];

        // Return FALSE so that the final '\n' character doesn't get added
        return FALSE;
    }
    // For any other character return TRUE so that the text gets added to the view
    return TRUE;
}
 4
Author: Abhishek Pathak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 12:18:27

Swift

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
    }
    return true
}

i skonfigurować

 4
Author: Eduardo Oliveros Acosta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 23:55:24

Kod Swift

Zaimplementuj UITextViewDelegate w swojej klasie / widoku w następujący sposób:

class MyClass: UITextViewDelegate  { ...

Ustaw delegata textView na self

myTextView.delegate = self

A następnie wdrożyć następujące:

  func textViewDidChange(_ textView: UITextView) {
    if textView.text.characters.count >= 1 {

        if let lastChar = textView.text.characters.last {

            if(lastChar == "\n"){

              textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
              textView.resignFirstResponder()
            }
        }
    }
}

Edytuj Zaktualizowałem Kod, ponieważ nigdy nie jest dobrym pomysłem, aby zmienić wejście użytkownika w polu tekstowym do obejścia i nie Resetowanie stanu po zakończeniu kodu hack.

 4
Author: Frithjof Schaefer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 13:05:59

Możesz także ukryć klawiaturę po dotknięciu ekranu widoku:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }
 3
Author: Hitesh Vaghela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-24 10:45:04

Szybka Odpowiedź:

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}
 3
Author: Glauco Neves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 02:26:08

Użyłem tego kodu, aby zmienić respondera.

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }
 3
Author: Avijit Nagare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 11:23:32

Ok. Każdy dał odpowiedzi sztuczkami, ale myślę, że właściwym sposobem na osiągnięcie tego jest

Podłączenie następującej akcji do zdarzenia " Did End On Exit" W Interface Builder. (kliknij prawym przyciskiem myszy TextField i przeciągnij cntrl z " skończyło się na wyjściu " do następującej metody.

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}
 3
Author: carbonr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 10:23:16
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
{
    if (range.length==0) {
        if ([text isEqualToString:@"\n"]) {
            [txtView resignFirstResponder];
            if(textView.returnKeyType== UIReturnKeyGo){

                [self PreviewLatter];
                return NO;
            }
            return NO;
        }
    }   return YES;
}
 1
Author: Rinju Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 06:37:38
+ (void)addDoneButtonToControl:(id)txtFieldOrTextView
{
    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
        txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
        txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
    }

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
                                                                          0,
                                                                          [Global returnDeviceWidth],
                                                                          50)];
    numberToolbar.barStyle = UIBarStyleDefault;


    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
                                                                style:UIBarButtonItemStyleBordered
                                                               target:txtFieldOrTextView
                                                               action:@selector(resignFirstResponder)];

    numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
    [numberToolbar sizeToFit];

    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
         ((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
         ((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
}
 1
Author: Venu Gopal Tewari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-10 08:01:46

Pytanie, Jak to zrobić z klawiszem return, ale myślę, że może to pomóc komuś z zamiarem, aby klawiatura zniknęła podczas korzystania z UITextView:

@IBOutlet weak var textView: UITextView!

private func addToolBarForTextView() {
  let textViewToolbar: UIToolbar = UIToolbar()
  textViewToolbar = UIBarStyle.Default
  textViewToolbar = [
    UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.cancelInput)),
    UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
    UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.doneInput))
  ]
  textViewToolbar()
  self.textView.inputAccessoryView = textViewToolbar //do it for every relevant textView if there are more than one
}

func doneInput() {
  self.textView.resignFirstResponder()
}

func cancelInput() {
  self.textView.text = ""
  self.textView.resignFirstResponder()
}

Wywołanie addToolBarForTextView () w viewDidLoad lub innej metodzie cyklu życia.

Wydaje się, że było to dla mnie idealne rozwiązanie. Zdrówko, zdrówko]}

Murat

 1
Author: Murat Yasar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 11:04:37
-(BOOL)textFieldShouldReturn:(UITextField *)textField; // called from textfield (keyboard)

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; // good tester function - thanks
 0
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-30 13:36:25

Wiem, że to nie jest dokładna odpowiedź na to pytanie, ale znalazłem ten wątek po polowaniu na internet w poszukiwaniu odpowiedzi. Zakładam, że inni podzielają to uczucie.

To jest moja wariancja UITapGestureRecognizer, który uważam za niezawodny i łatwy w użyciu-wystarczy ustawić delegata TextView do kontrolera ViewController.

Zamiast ViewDidLoad dodaję UITapGestureRecognizer, gdy TextView stanie się aktywny do edycji:

-(void)textViewDidBeginEditing:(UITextView *)textView{
    _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer: _tapRec];
    NSLog(@"TextView Did begin");
}

Gdy dotknę poza TextView, widok kończy tryb edycji i uitapgesturerecognizer usuwa się, więc mogę kontynuować interakcję z innymi kontrolkami w widoku.

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}
Mam nadzieję, że to pomoże. Wydaje się to tak oczywiste, ale nigdy nie widziałem takiego rozwiązania nigdzie w sieci - czy robię coś nie tak?
 0
Author: BGC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-13 21:12:27

Nie zapomnij ustawić delegata dla textView - w przeciwnym razie resignfirstresponder nie będzie działać.

 0
Author: Ron Holmes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 06:53:07

Spróbuj tego .

NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];
 0
Author: Hiren Panchal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 09:51:55

Dla Xcode 6.4., Swift 1.2 :

   override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
    {
        super.touchesBegan(touches, withEvent: event)
        if let touch = touches.first as? UITouch
        {
            self.meaningTextview.resignFirstResponder()
        }
    }
 0
Author: MB_iOSDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 09:12:13

Mój hack do tego:

1-Utwórz przycisk pokrywający cały widok; 2-Wyślij go do tła widoku, 3-zmień jego typ Z "Round Rect" na "Custom" w Inspektorze atrybutów, 4-Utwórz akcję 5-wdrożenie metody działania:

- (IBAction)bgTouched:(id)sender 
{
    //to dismiss keyboard on bg btn pressed
    [_userInput resignFirstResponder];
}

Gdzie _userInput to twoje pole tekstowe

 -1
Author: LAOMUSIC ARTS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 11:55:42