2010-01-30 31 views
1

我的导航栏中有一个充当搜索框的UITextView。我想在用户点击文本框之下时关闭相关的键盘 - 即在MKMapView上。不过,我不知道如何做到这一点,因为它看起来不像我可以拦截来自mapview的触摸。当用户点击Mapview时关闭键盘

我已经看过一些解决方案,但似乎没有为我的情况工作,据我所知。有没有人有一个简单的方法来做到这一点?我有一点小菜,所以如果我没有提供相关信息,请告诉我,如果可以的话,请在答案中提供几行示例代码 - 我用术语仍然有点不稳定。谢谢!

screenshot http://img532.imageshack.us/img532/4070/keyboardsm.png

回答

1

假设

UITextView *textView; 

然后你就可以通过发送取消键盘:

[textView resignFirstResponder]; 

另外:你可能更愿意使用UISearchBar并将其设置为的的navigationItem.titleView视图控制器。这提供了一些不错的委托方法。

+0

感谢您使用UISearchBar的提示。我会尝试。我的问题是,我不知道如何检测用户何时单击mapview,所以我无处可以写这行代码:) – Imran 2010-01-30 17:44:45

+0

在添加代码获取触摸。 – FelixLam 2010-01-30 18:22:46

+0

我不认为你可以做到这一点!请参阅:http://stackoverflow.com/questions/1049889/how-to-intercept-touches-events-on-a-mkmapview-or-uiwebview-objects。如果我误解,请告诉我。我正在考虑在键盘启动时覆盖地图上的透明视图,并从中获取相关信息(我的链接中接受的解决方案看起来过于复杂)。 – Imran 2010-01-30 18:50:33

1

我知道这是一个旧的,但如果其他人正在寻找一个简单的答案,这是我的解决方案,以获得一个“mapView”resignFirstResponder。这将以类似于iphone上的Google地图应用的方式工作,其中在开始编辑搜索文本字段时出现半透明框。

首先,你需要让你的视图控制器UISearchBarDelegate

@interface ViewControllerName <UISearchBarDelegate> 

// your code here 

@end 

然后执行以下的委托方法:

@implementation ViewControllerName 

// your code here 

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
darkBg = [[UIControl alloc] initWithFrame:CGRectMake(0, 244, 320, 300)]; 
[darkBg setBackgroundColor:[UIColor blackColor]]; 
[darkBg addTarget:nil action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchDown]; 
[darkBg setAlpha:0.8]; 
[UIView beginAnimations:@"slideup" context:nil]; 
[darkBg setCenter:CGPointMake(160, 194)]; 
[self.view addSubview:darkBg]; 
[UIView commitAnimations]; 
} 

- (void)hideKeyboard { 
[UIView beginAnimations:@"fadeou" context:nil]; 
[darkBg setAlpha:0.0]; 
[UIView commitAnimations]; 
[addressField resignFirstResponder]; 
[darkBg performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:1.0]; 
[darkBg release]; 
} 
0

一少哈克的解决办法是依靠的的MKMapView委托方法一关闭键盘

- (void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated { 
    if ([self.textField isFirstResponder]) { 
    [self.textField resignFirstResponder]; 
    } 
}