そのため、ユーザーがテキストを送信できるようにするために使用している UITextView があります。
私の問題は、ユーザーが UITextView からタップして「キャンセル」できるようにする方法がわからないことです。
そのため、ユーザーがテキストを送信できるようにするために使用している UITextView があります。
私の問題は、ユーザーが UITextView からタップして「キャンセル」できるようにする方法がわからないことです。
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 をタップすると、ファーストレスポンダーが辞任し、キーボードが閉じます。
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;
}
これは、アウトレットに依存せず、コントローラー内の任意の数の 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];
}
それぞれに特定のアウトレットを必要とせずに、どのビューからも辞任できるバージョンが必要でした。これが私のソリューションであり、標準のコンテナビューの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);
}