質問

んUITextViewしているところを利用することができるのを提出します。

私の問題ではないのですがどうするのユーザが"Cancel"をタップすからUITextView.

役に立ちましたか?

解決

tuzzolotronの答えを簡素化: 以下の出口が正しくXIBに接続されている場合、

    IBOutlet UITextView *myTextView;

ビューコントローラでこれを使用します:

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

ビューコントローラのビュー、テキストビューの外側にタップ、キーボードを閉じ、ファーストレスポンダを辞任されます。

他のヒント

UITableViews、検索バーやキーボードを操作する場合、私は多くのことを使用される別のアプローチであり、この、私はあなたがテキストフィールドにそれを適用することができると思います。

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

そして、ここでは簡単なコールバック関数だ。

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

それがお役に立てば幸いです。

私の見解でます:

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

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

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

これは古い記事ですが、私は(多分それは当時入手できませんでした)ずっと簡単なものを見つけたとき、私は、このソリューションを実装しました。

[self.myTextView endEditing:YES];

私はのUITableViewを使用していますので、私はdidSelectRowAtIndexPathにこのラインを置く:方法。 これまでのところ、とても良い...

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の答えはあまりにも私のために働きました。ここでは、単純な迅速同等です。

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

ここでコンセントに依存せず、自分のコントローラ内のUITextFieldオブジェクトの任意の数で動作するように起こっているよりよい解決策です。

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

非常に簡単

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

たかったので、このことを経て退任からビューのことなく、特定の店舗それぞれ..ここでは私のソリューションIに入っ標準コンテナ見..

を使ってMonoTouchスレッドセーフで、C#、なすべきかどのように変換す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);
    }

私について教えてください...

  • 追加の参照のTextViewに@のインタフェースおViewController:

    @property (weak, nonatomic) IBOutlet UITextView *yourTextView;
    
  • このメソッドをオーバーライドし、@の実施ViewController:

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        if ([self.yourTextView isFirstResponder]) {
          [self.yourTextView resignFirstResponder];
        }
    }
    
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top