46

そのため、ユーザーがテキストを送信できるようにするために使用している UITextView があります。

私の問題は、ユーザーが UITextView からタップして「キャンセル」できるようにする方法がわからないことです。

4

10 に答える 10

107

tuzzolotron の答えを単純化する:次のコンセントが xib で適切に接続されている場所

    IBOutlet UITextView *myTextView;

これを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];
}

Text View の外側にある View Controller の View をタップすると、ファーストレスポンダーが辞任し、キーボードが閉じます。

于 2009-10-12T04:50:33.333 に答える
31

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

それが役に立てば幸い

于 2011-11-03T15:31:49.550 に答える
7

私からしてみれば:

- (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;
}
于 2009-09-21T19:20:37.123 に答える
2

これは、アウトレットに依存せず、コントローラー内の任意の数の 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];
}
于 2013-08-21T17:00:03.707 に答える
0

それぞれに特定のアウトレットを必要とせずに、どのビューからも辞任できるバージョンが必要でした。これが私のソリューションであり、標準のコンテナビューの1つに入れました。

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);
    }
于 2013-02-13T23:26:14.403 に答える