2009-09-21 5 views

Antwort

107

Vereinfachen tuzzolotron's answer: Wo der folgenden Ausgang richtig in Ihrem xib verbunden ist

IBOutlet UITextView *myTextView; 

verwenden in der View-Controller:

Ein Antippen der View-Controller-Ansicht außerhalb der Textansicht beendet den ersten Responder und schließt die Tastatur.

+1

Große Lösung! – DeZigny

+0

Ich würde mich freuen, dem downvoter zu helfen, wenn das nicht für sie funktioniert .. einfach einen Kommentar hinterlassen oder eine neue Frage beginnen und hier verlinken. – ohhorob

+6

ohhorob, funktioniert diese Lösung nicht, wenn wir auf eine andere Steckdose in Sicht klicken, können Sie mir dabei helfen? – TilalHusain

7

Aus meiner Sicht:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 

    // pass touches up to viewController 
    [self.nextResponder touchesBegan:touches withEvent:event]; 
} 

In meinem Viewcontroller:

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

funktionierts, oder fragen Sie uns auf den Code suchen? – Garrett

+0

Dies ist die Lösung, die ich implementiert habe. Es klappt. – tuzzolotron

+1

Wie füge ich die Methode touchesBegan zu einem UITableView hinzu, das ich eine Unteransicht von self.view des UIViewController, in dem ich arbeite, erstellt habe. Muss ich UITableView von Unterklasse, d. Oder gibt es einen einfacheren Weg dies zu tun, ohne UITableView zu unterklassifizieren? – ma11hew28

30

Ein weiterer Ansatz, den ich viel verwendet wird, wenn mit UITableViews, Searchbar und Tastatur funktioniert dies, ich glaube, Sie es zu Textfeld

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

Und dann hier anwenden können ist die einfache Callback-Funktion

- (void)hideKeyboard { 
    [myTextField resignFirstResponder]; 
} 

Ich hoffe, es hilft

+2

Sie können zu [Selbstansicht] hinzufügen, wenn Sie mit einem ViewController arbeiten. –

+0

nein, es wird nicht funktionieren, Tabellen und scrollt Ansicht hat ihre eigenen Interaktionen – Softlion

+0

Diese Antwort ist die beste.Auch funktioniert es für eine Gruppe von Textfeldern in einem scrollView, wenn ich tapGestureRecognizer zu self.view hinzufügen –

0

Ich wollte eine Version von diesem, die für den Rücktritt von jeder Ansicht funktionierte, ohne bestimmte Ausgänge für jeden zu verlangen .. Hier ist meine Lösung, die ich in eine von meinen Standard-Containern Ansichten ..

Es ist mit Monotouch C#, obwohl es offensichtlich sein sollte, wie es konvertieren zu 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); 
    } 
1

Hier ist eine bessere Lösung, die nicht abhängig ist auf eine Steckdose und wird mit einer beliebigen Anzahl von UITextField-Objekten in Ihrem Controller arbeiten.

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

nicht Ich denke, Sie müssen nach UITextField suchen - auch wenn Sie "Editing beenden": "wahllos funktioniert das Umschalten zwischen Textfeldern, die Tastatur bleibt jedoch aufrecht –

0

Mein Weg, es zu tun ...

  • einen Verweis auf die Textview in der @interface Ihren Viewcontroller hinzu:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView; 
    
  • überschreibt diese Methode in dem @ Implementierung Ihres ViewControllers:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
    { 
        if ([self.yourTextView isFirstResponder]) { 
         [self.yourTextView resignFirstResponder]; 
        } 
    } 
    
1

Sehr einfach

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.view endEditing:YES]; 
} 
2

Dies ist eine alte Post, aber ich war die Umsetzung dieser Lösung, wenn ich etwas viel einfacher gefunden (vielleicht ist es nicht verfügbar war damals).

[Selbst.myTextView endEditing: JA];

Ich benutze eine UITableView, also lege ich diese Zeile auf die didSelectRowAtIndexPath: -Methode. So weit, so gut ...

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

Antwort des ohhorob auch für mich gearbeitet. Hier ist das einfache schnelle Äquivalent.

1

Hier ist die schnelle 3-Code

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) 
} 
Verwandte Themen