Wie kann ich die Tastatur für UITextView mit der Eingabetaste schließen?


382

In der IB-Bibliothek heißt es in der Einführung, dass beim returnDrücken der Taste die Tastatur für UITextViewverschwindet. returnTatsächlich kann der Schlüssel jedoch nur als '\ n' fungieren.

Ich kann eine Schaltfläche hinzufügen und [txtView resignFirstResponder]damit die Tastatur ausblenden.

Aber gibt es eine Möglichkeit, die Aktion für die returnTaste in der Tastatur hinzuzufügen, damit ich sie nicht hinzufügen muss UIButton?


Folgen Sie den Anweisungen in diesem Blog-Beitrag: iphonedevelopertips.com/cocoa/…
ManojN

Antworten:


354

UITextViewhat keine Methoden, die aufgerufen werden, wenn der Benutzer die Eingabetaste drückt. Wenn Sie möchten, dass der Benutzer nur eine Textzeile hinzufügen kann, verwenden Sie a UITextField. Wenn Sie die Eingabetaste drücken und die Tastatur für a UITextViewausblenden, folgen Sie nicht den Richtlinien der Benutzeroberfläche.

Selbst dann, wenn Sie dies tun möchten, implementieren Sie die textView:shouldChangeTextInRange:replacementText:Methode von UITextViewDelegateund überprüfen Sie dabei, ob der Ersatztext ist\n verbergen Sie , die Tastatur.

Es könnte andere Wege geben, aber mir sind keine bekannt.


1
Danke und die Methode funktioniert gut. Der Grund für die Verwendung von UITextView besteht darin, dass es Text in mehreren Zeilen enthalten kann. Und jetzt benutze ich es als Nachrichtenbox.
Chilly Zhong

28
Es ist einfach genug, die [textField setReturnKeyType: UIReturnKeyDone];
Eingabetaste

9
Okay, ich verstehe jetzt, dass die Apple-Methode zum Beenden mit einem mehrzeiligen Textfeld darin besteht, der Menüleiste "
Fertig"

8
Dies ist keine gute Möglichkeit, dies zu beheben, da Sie den Benutzer auf die Verwendung der Eingabetaste beschränken, um die Tastatur zu verlassen. Der wahrscheinlich beste Weg ist das Hinzufügen einer Schaltfläche, die die resignFirstResponder-Methode ausführt.
Ele

5
@Casebash. Es scheint, dass das Setzen der Eingabetaste auf "erledigt" das Problem in Xcode 6.4, Swift 2.0 nicht löst. Ich setze den Schlüssel mit IB.
MB_iOSDeveloper

505

Ich dachte, ich würde das Snippet stattdessen hier posten:

Stellen Sie sicher, dass Sie die Unterstützung für das UITextViewDelegateProtokoll deklarieren .

- (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
}

75
Das Problem ist, dass dies nicht wirklich eine Möglichkeit ist, zu erkennen, dass der Benutzer die Eingabetaste gedrückt hat . Der Benutzer fügt möglicherweise ein Rückgabezeichen in das Textfeld ein, und Sie erhalten dieselbe Delegatennachricht. Grundsätzlich missbrauchen Sie die Textansicht. Die Möglichkeit, die Tastatur zu schließen, besteht darin, (1) dies überhaupt nicht zu tun (wie beim Verfassen einer Nachricht in der Mail-App) oder (2) an anderer Stelle in der Benutzeroberfläche eine Schaltfläche "Fertig" zu verwenden (wie in der Notes-App). Sie können beispielsweise eine solche Schaltfläche als Zubehöransicht an die Tastatur anhängen.
Matt

@ Sam V das Snippet war cooler Mann. Für mich geht das. Vielen Dank Mann. Gibt es einen Ausschnitt für die Auflösung der numerischen Tastatur? Grüße Shishir
Shishir.Bobby

Großartig. Nur eine Erinnerung daran, dass Sie in einigen Situationen, um die Tastatur loszuwerden, Folgendes versuchen ... [self.view endEditing: YES];
Fattie

@Vojto, funktioniert gut auf dem iPad. Sie haben den Delegaten wahrscheinlich nicht festgelegt.
Vincent

4
Das Problem ist, dass die Tastatur möglicherweise einen Teil der Schnittstelle verbirgt, die zum Schließen verwendet wird. Es ist wirklich absurd, dass IOS nicht auf jeder Tastatur eine Schaltfläche hat, mit der die Tastatur geschlossen werden kann, damit der Benutzer dies tun kann, wenn er dies wünscht.
Sani Elfishawy

80

Ich weiß, dass dies bereits beantwortet wurde, aber ich mag es nicht wirklich, das String-Literal für die Newline zu verwenden. Deshalb habe ich Folgendes getan.

- (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
}

6
Ich könnte es so ändern: NSRange resultRange = [text rangeOfCharacterFromSet: [NSCharacterSet newlineCharacterSet] Optionen: NSBackwardsSearch]; Da dies ohnehin ein Hack ist, scheint es sicherer zu sein, das Ende der Zeichenfolge auf eine Rückkehr zu überprüfen.
Maxpower

@maxpower Sehr guter Kommentar. Es ist auch besser, gegen ersetzten Text zu prüfen, z NSString *replacedText = [textView.text stringByReplacingCharactersInRange:range withString:text].
Rudolf Adamkovič

Stellen Sie sich einen Benutzer vor, der Text einfügt , der von einer anderen Stelle kopiert wurde und eine neue Zeile enthält . Sie wären wahrscheinlich verwirrt, wenn die App anstelle des Textes nur die Tastatur schließt.
Nikolai Ruhe

44

Ich weiß, dass dies oft beantwortet wurde, aber hier sind meine zwei Cent für das Problem.

Ich fand die Antworten von samvermette und ribeto wirklich nützlich, und auch den Kommentar von maxpower in der ribeto ‚s Antwort. Bei diesen Ansätzen gibt es jedoch ein Problem. Das Problem, das Matt in der Samvermette erwähnt Antwort , ohne dass etwas , wenn der Benutzer etwas mit einem Zeilenumbruch einfügen möchte.

Mein Ansatz ist also eine Mischung aus den drei oben genannten Lösungen und es wird nur geprüft, ob die eingegebene Zeichenfolge eine neue Zeile ist, wenn die Länge der Zeichenfolge 1 beträgt. Daher stellen wir sicher, dass der Benutzer tippt, anstatt sie einzufügen.

Folgendes habe ich getan:

- (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;
}

Dies ist die beste Lösung für dieses Problem. Die samvermette-Antwort berücksichtigt nicht die Situation, in der der Benutzer einen Text einfügen möchte.
Marcopaivaf

36

Eine elegantere Möglichkeit besteht darin, die Tastatur zu schließen, wenn der Benutzer irgendwo außerhalb des Tastaturrahmens tippt.

Stellen Sie zunächst die Ansicht Ihres ViewControllers im Identitätsinspektor in UIBuilder auf die Klasse "UIControl" ein. Ziehen Sie die Ansicht bei gedrückter Ctrl-Taste in die Header-Datei des ViewControllers und verknüpfen Sie sie als Aktion mit dem Ereignis als Touch Up Inside, z.

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

In der ViewController-Hauptdatei ist ViewController.m:

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

Mit ähnlichen Techniken können Sie zweimal tippen oder lange berühren. Möglicherweise müssen Sie Ihren ViewController als UITextViewDelegate festlegen und die TextView mit dem ViewController verbinden. Diese Methode funktioniert sowohl für UITextView als auch für UITextField.

Quelle: Big Nerd Ranch

BEARBEITEN: Ich möchte auch hinzufügen, dass die obige Technik bei Verwendung eines UIScrollView möglicherweise nicht so einfach über den Interface Builder funktioniert. In diesem Fall können Sie einen UIGestureRecognizer verwenden und stattdessen die darin enthaltene Methode [[self view] endEditing: YES] aufrufen. Ein Beispiel wäre:

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

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

Wenn der Benutzer außerhalb der Tastatur tippt und nicht auf ein Eingabefeld tippt, wird die Tastatur geschlossen.


1
Ich mag die Idee mit, GestureRecognizeraber das große Problem ist, dass nicht alle Schaltflächen oder Steuerelemente in der Ansicht mehr anklickbar sind.
Experte

35

Fügen Sie diese Methode in Ihren View Controller ein.

Swift :

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

Diese Methode kann auch für Sie hilfreich sein:

/**
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()
        }
    }
}

2
Vergessen Sie nicht, das Protokoll UITextViewDelegate zu bestätigen :)
swiftBoy

Ich denke nicht, dass es eine gute Idee ist, touchBegan zu überschreiben und nicht anzurufen super.touchesBegan(touches:withEvent:).
TGO

Um die Symmetrie dieses Codes auszudrücken, sollten Sie schreiben else { return true }.
Bedeutung-Angelegenheiten

@ Bedeutung-Angelegenheiten überhaupt nicht
Alexander Volkov

@AlexanderVolkov Sie stimmen nicht zu, dass es sich um eine symmetrische Situation handelt, Sie wissen nicht, was ich meine, Sie glauben nicht an den Wert von semantisch korrektem Code, oder ...?
Bedeutung-Angelegenheiten

26
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"])
        [textView resignFirstResponder];
    return YES;
}

yourtextView.delegate=self;

Fügen Sie auch hinzu UITextViewDelegate

Vergessen Sie nicht, das Protokoll zu bestätigen

Wenn Sie nicht hinzugefügt haben if([text isEqualToString:@"\n"]), können Sie nicht bearbeiten


2
-1 Dies ist nur eine schlechtere Version von Samvermettes Antwort. Sie haben die Rückkehr verpasst, NOwenn der Text gleich ist @"\n".
Devios1

17

Bei der Verwendung mit uitextview gibt es eine andere Lösung: Sie können die Symbolleiste als InputAccessoryView in "textViewShouldBeginEditing" hinzufügen und über die Schaltfläche "Fertig" dieser Symbolleiste die Tastatur schließen. Der Code hierfür lautet wie folgt:

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]];

In der textviewdelegate-Methode

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

In Aktion von Button Done, die sich in der Symbolleiste befindet, folgt:

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

17

Ich fand die Antwort von Josebama die vollständigste und sauberste Antwort in diesem Thread.

Unten ist die Swift 4- Syntax dafür:

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}

Die resultRangeZiele zu testen , ob der Text enthält nur neue Zeilen , die schwer Code „\ n“ vermeiden.
Qinghua

6

schnell

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

und konfigurieren


Woher kommt dieser Screenshot?
Sam

6

Verwenden des Navigationscontrollers zum Hosten einer Leiste zum Schließen der Tastatur:

in der .h-Datei:

UIBarButtonItem* dismissKeyboardButton;

in der .m-Datei:

- (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

Genau wie bei einem matten Kommentar zu Samvermette gefällt mir auch die Idee, "\ n" zu erkennen, nicht. Die "Return" -Taste ist aus einem Grund in UITextView vorhanden, der natürlich zur nächsten Zeile führen soll.

Die beste Lösung ist meiner Meinung nach die Nachahmung der iPhone-Nachrichten-App, dh das Hinzufügen einer Symbolleiste (und einer Schaltfläche) auf der Tastatur.

Ich habe Code aus folgendem Blog-Beitrag erhalten:

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

Schritte:

- Fügen Sie Ihrer XIB-Datei eine Symbolleiste hinzu - stellen Sie die Höhe auf 460 ein

- Fügen Sie ein Symbolleistenschaltflächenelement hinzu (falls nicht bereits hinzugefügt). Wenn Sie es nach rechts ausrichten müssen, fügen Sie XIB auch ein flexibles Element mit Balkenschaltflächen hinzu und verschieben Sie das Element mit den Symbolleistenschaltflächen

- Erstellen Sie eine Aktion, die Ihr Schaltflächenelement wie folgt mit resignFirstResponder verknüpft:

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

-Dann:

- (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];
}

Off Topic. Ihre Lösung ist zwar elegant, beantwortet jedoch nicht die ursprüngliche Frage: "Wie kann ich die Tastatur für UITextView mit der Eingabetaste schließen?". Es gibt Situationen, in denen UITextView verwendet wird, um einen UITextField-Zeilenumbruch zu simulieren und nicht mehrere Zeilen einzugeben.
SwiftArchitect

2
Obwohl es nicht zum Thema gehört, ist es sehr nützlich. Ich möchte auch, dass eine UITextView mehrzeilig eingegeben wird und die Tastatur geschlossen wird, wenn ich möchte.
Yeung

5

Habe dieses Problem einfach anders gelöst.

  • Erstellen Sie eine Schaltfläche, die im Hintergrund platziert wird
  • Ändern Sie im Attributinspektor den Schaltflächentyp in "Benutzerdefiniert", um die Schaltfläche transparent zu machen.
  • Erweitern Sie die Schaltfläche, um die gesamte Ansicht abzudecken, und stellen Sie sicher, dass sich die Schaltfläche hinter allen anderen Objekten befindet. Eine einfache Möglichkeit, dies zu tun, besteht darin, die Schaltfläche in der Ansicht an den Anfang der Listenansicht zu ziehen
  • Ziehen Sie die Schaltfläche bei gedrückter Ctrl-Taste in die viewController.hDatei und erstellen Sie eine Aktion (gesendetes Ereignis: Touch Up Inside) wie folgt:

    (IBAction)ExitKeyboard:(id)sender;
  • In ViewController.msollte aussehen wie:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
  • Führen Sie die App aus, und wenn Sie von der Textansicht weg klicken, verschwindet die Tastatur

Sie müssen außerdem Folgendes hinzufügen: - (void) textViewDidEndEditing: (UITextView *) textView {[self.TextView resignFirstResponder]; }
Samouray

5

Fügen Sie einen Beobachter in viewDidLoad hinzu

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

und verwenden Sie dann den Selektor, um nach "\ n" zu suchen.

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

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

Es wird "\ n" verwendet und nicht speziell nach einem Return-Schlüssel gesucht, aber ich denke, das ist in Ordnung.

AKTUALISIEREN

Siehe die Antwort von ribto unten, die [NSCharacterSet newlineCharacterSet]anstelle von verwendet wird\n


Err es wird verwendet \nund der Return-Schlüssel wird basierend darauf erkannt, \nso dass nach dem Return-Schlüssel gesucht wird. Der einzige Unterschied besteht darin, dass Sie Benachrichtigungen anstelle von textViewDelegates verwenden.
GoodSp33d

Jetzt denke ich, dass [NSCharacterSet newlineCharacterSet]es besser wäre, nach \ n zu suchen als nach \ n.
ToddB

5

SWIFT-Code

Implementieren Sie UITextViewDelegate in Ihrer Klasse / Ansicht wie folgt:

class MyClass: UITextViewDelegate  { ...

Setzen Sie den textView-Delegaten auf self

myTextView.delegate = self

Und implementieren Sie dann Folgendes:

  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()
            }
        }
    }
}

BEARBEITEN Ich habe den Code aktualisiert, da es nie eine gute Idee ist, die Benutzereingabe in einem Textfeld für eine Problemumgehung in zu ändern und den Status nach Abschluss des Hack-Codes nicht zurückzusetzen.


4

Versuche dies :

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

    return YES;

}

4

// Du kannst das benutzen ...

Schritt 1. Der erste Schritt besteht darin, sicherzustellen, dass Sie die Unterstützung für deklarieren UITextViewDelegate Protokoll . Dies geschieht in Ihrer Header-Datei. Als Beispiel wird hier der Header genannt

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end

Schritt 2. Als nächstes müssen Sie den Controller als Delegierten von UITextView registrieren. Ausgehend vom obigen Beispiel habe ich hier das UITextViewmit EditorControllerals Delegat initialisiert …

- (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;
    }

Schritt 3. Und jetzt besteht das letzte Puzzleteil darin, auf die shouldCahngeTextInRangeNachricht wie folgt zu reagieren :

- (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;
}

3

Sie können die Tastatur auch ausblenden, wenn Sie sie auf dem Bildschirm berühren:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }

IMHO, dies ist ein sehr guter Ansatz, viel besser als mit einem Knopf, der die gesamte Ansicht abdeckt.
WebOrCode

3

Schnelle Antwort:

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

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}

3

Ich habe diesen Code verwendet, um den Responder zu ändern.

 - (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;

    }

warum nicht [self.view endEditing: YES] verwenden; Einmal??
Ajay_nasa

3

In der Frage wird gefragt, wie es mit der Eingabetaste gemacht werden soll, aber ich denke, dies könnte jemandem helfen, der die Tastatur bei Verwendung von UITextView einfach verschwinden lassen möchte:

private func addToolBarForTextView() {
    let textViewToolbar: UIToolbar = UIToolbar()
    textViewToolbar.barStyle = .default
    textViewToolbar.items = [
        UIBarButtonItem(title: "Cancel", style: .done,
                  target: self, action: #selector(cancelInput)),
        UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
                  target: self, action: nil),
        UIBarButtonItem(title: "Post Reply", style: .done,
                  target: self, action: #selector(doneInput))
    ]
    textViewToolbar.sizeToFit()
    yourTextView.inputAccessoryView = textViewToolbar
}

@objc func cancelInput() { print("cancel") }
@objc func doneInput() { print("done") }

override func viewDidLoad() {
    super.viewDidLoad()
    addToolBarForTextView()
}

Rufen Sie addToolBarForTextView () in viewDidLoad oder einer anderen Lebenszyklusmethode auf.

Es scheint, dass dies die perfekte Lösung für mich war.

Prost,

Murat


1
Für 2019 jetzt kopieren und einfügen, keine Syntaxfehler und aktuelle Benennung
Fattie

1
bei weitem die beste Antwort hier. Ich habe gerade den einfachen Syntaxfehler behoben und natürlich nach Ihren Wünschen bearbeitet. Vielen Dank!
Fattie

2

OK. Jeder hat Antworten mit Tricks gegeben, aber ich denke, der richtige Weg, dies zu erreichen, ist durch

Verbinden der folgenden Aktion mit dem Ereignis " Did End On Exit " in Interface Builder. (Klicken Sie mit der rechten TextFieldMaustaste auf und ziehen Sie bei gedrückter Ctrrl-Taste von " Wurde beim Beenden beendet " auf die folgende Methode.

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}

6
-1 Die Frage ist über UITextView und nicht UITextField mein Freund
Yogi

2
Die meisten dieser Antworten sind hier mit Stimmen, da sie für verschiedene Szenarien verschiedener Entwickler geeignet sind.
Carbonr

Wenn Sie ein UITextField verwenden, ist dies der richtige Weg. Übrigens sollten Sie für Objective-C-BOOLs JA / NEIN verwenden, nicht WAHR / FALSCH.
Jon Shier

1
@jshier: WAHR / FALSCH ist auch in Ordnung
Yogi

2

Ähnlich wie bei anderen Antworten mit der UITextViewDelegateneueren, schnellen Benutzeroberfläche isNewlinewäre:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if let character = text.first, character.isNewline {
        textView.resignFirstResponder()
        return false
    }
    return true
}

1
- (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
+ (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;
    }
}

0

Ich weiß, dass es nicht die genaue Antwort auf diese Frage ist, aber ich habe diesen Thread gefunden, nachdem ich im Internet nach einer Antwort gesucht habe. Ich gehe davon aus, dass andere dieses Gefühl teilen.

Dies ist meine Varianz des UITapGestureRecognizer, die ich für zuverlässig und einfach zu verwenden halte. Setzen Sie einfach den Delegaten der Textansicht auf den ViewController.

Anstelle von ViewDidLoad füge ich den UITapGestureRecognizer hinzu, wenn die Textansicht zum Bearbeiten aktiv wird:

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

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

Wenn ich außerhalb der Textansicht tippe, beendet die Ansicht den Bearbeitungsmodus und der UITapGestureRecognizer entfernt sich selbst, sodass ich weiterhin mit anderen Steuerelementen in der Ansicht interagieren kann.

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}

Ich hoffe das hilft. Es scheint so offensichtlich, aber ich habe diese Lösung noch nie im Internet gesehen - mache ich etwas falsch?


0

Vergessen Sie nicht, den Delegaten für die Textansicht festzulegen - andernfalls funktioniert resignfirstresponder nicht.


0

Versuche dies .

NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];

0

Für 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

Sie sollten UIToolbarUITextView nach oben hinzufügen, um es einfacher zu machen als zu verwendenshouldChangeTextIn

In Swift 4

let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
        ]
        textView.inputAccessoryView = toolbar
@objc func doneAction(){
 self.textView.resignFirstResponder()
}

Mit Abstand die beste Lösung. Beachten Sie, dass Sie anstelle des Rahmens einfachtoolbar.sizeToFit()
Fattie
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.