Domanda

Quindi ho un UITextView che sto utilizzando per consentire all'utente di inviare del testo.

Il mio problema è che non riesco a capire come consentire all'utente di "Annulla" toccando lontano da UITextView.

È stato utile?

Soluzione

risposta : Dove la seguente uscita è collegato correttamente nel XI ter

    IBOutlet UITextView *myTextView;

Utilizzare questa nel controller della vista:

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

Un tap su View Controller di vista, al di fuori del testo View, si dimetterà il primo risponditore, chiudendo la tastiera.

Altri suggerimenti

Un altro approccio che ho usato molto quando lavoravo con UITableViews, barra di ricerca e tastiera è questo, penso che tu possa applicarlo al campo di testo

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

E poi, ecco la semplice funzione di callback

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

Spero che sia d'aiuto

A mio parere:

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

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

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

Questo è un vecchio post, ma mi è stato implementando questa soluzione quando ho trovato qualcosa di molto più semplice (forse non era disponibile allora).

[self.myTextView endEditing: YES];

Io sto usando un UITableView, così ho messo questa linea sul didSelectRowAtIndexPath: metodo. Fin qui, tutto bene ...

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

La risposta di ohhorob ha lavorato anche per me. Ecco il semplice equivalente veloce.

Ecco il codice swift 3

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

Qui è una soluzione migliore che non dipende da una presa e sta andando a lavorare con qualsiasi numero di oggetti UITextField nel controller.

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

Molto facile

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

Volevo una versione di questo che ha funzionato per dimettersi da qualsiasi vista, senza la necessità di punti vendita specifici per ciascuno di essi .. Ecco la mia soluzione, che ho messo in uno dei miei punti di vista contenitori standard ..

E 'con MonoTouch C #, anche se dovrebbe essere ovvio come per convertirlo in 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);
    }

Il mio modo per farlo ...

  • Aggiungere un riferimento alla TextView nel @interface del vostro ViewController:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView;
    
  • l'override di questo metodo nel @implementation del vostro ViewController:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        if ([self.yourTextView isFirstResponder]) {
          [self.yourTextView resignFirstResponder];
        }
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top