Frage

Also ich habe eine UITextView, die ich verwende, damit der Benutzer einen Text vorzulegen.

Mein Problem ist, ich kann nicht scheinen, um herauszufinden, wie der Benutzer auf ‚Abbrechen‘ zu ermöglichen, von der UITextView durch Klopfen entfernt.

War es hilfreich?

Lösung

tuzzolotron Antwort : Wo der folgende Ausgang richtig angeschlossen ist in Ihrem xib

    IBOutlet UITextView *myTextView;

Verwenden Sie diese im View-Controller:

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

Ein Tippen auf der Anzeige für den View-Controller, außerhalb der Textansicht, die Ersthelfer zurücktreten, um die Tastatur zu schließen.

Andere Tipps

Ein weiterer Ansatz, den ich viel verwendet wird, wenn mit UITableViews, Searchbar und Tastatur arbeiten, ist dies, glaube ich Sie es auf Textfeld anwenden

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 ist die einfache Callback-Funktion

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

Hoffe, es hilft

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

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

[self.myTextView endEditing: YES];

Ich verwende eine UITableView, so habe ich diese Linie auf der DidSelectRowAtIndexPath: Methode. So weit, so gut ...

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 Antwort arbeitete auch für mich. Hier ist die einfache rasche gleichwertig.

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

Hier ist eine bessere Lösung, die nicht auf eine Steckdose hängt und wird mit einer beliebigen Anzahl von UITextField-Objekte 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];
}

Sehr einfach

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

wollte ich eine Version davon, die für ausscheid aus jeder Ansicht gearbeitet, ohne für jeden spezifischen Stellen erforderlich .. Hier ist meine Lösung, die ich in einem meiner Standard-Container-Ansichten stellen ..

Es ist Monotouch C #, obwohl es offensichtlich sein sollte, wie es in Objective-C konvertieren

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

Meine Art und Weise, es zu tun ...

  • Fügen Sie einen Verweis auf die Textview in der @interface Ihrem Viewcontroller:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView;
    
  • Überschreiben Sie diese Methode in der @implementation Ihrer Viewcontroller:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        if ([self.yourTextView isFirstResponder]) {
          [self.yourTextView resignFirstResponder];
        }
    }
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top