我的UIViewController
是UISearchBarDelegate
和MKMapViewDelegate
。 searchBarSearchButtonClicked
事件工作正常,但在iOS 4.2中测试时,在点击取消按钮时,不会调用searchBarCancelButtonClicked。在4.3中一切正常。我有相同代码的其他视图,它工作正常。我已经三次检查了方法签名。
可能与MapView有关,还是我做了一些明显的错误?
我的.h文件:
@interface MyViewController : UIViewController <UISearchBarDelegate,MKMapViewDelegate,UIAlertViewDelegate>{
MKMapView *mapMainView;
UISearchBar *sBar;
}
@property (nonatomic, retain) UISearchBar *sBar;
@end
我像这样创建搜索栏:
sBar = [[[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)] autorelease];
sBar.delegate = self;
sBar.showsCancelButton = YES;
[self.view addSubview:sBar];
[sBar becomeFirstResponder];
方法:
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
searchBar.hidden = YES;
}
有没有人知道为什么会这样?
答案 0 :(得分:21)
我遇到了完全相同的问题。按住取消按钮几秒钟。
我的原因是我在tableview中实现了UITapGestureRecognizer。因此,这优先于按钮单击或搜索栏中的“x”按钮单击。
我的案例中的解决方案是将手势识别限制为仅仅查看tableview的backgroundview。我猜你的情况可能会发生类似的事情。尝试将手势识别器限制为所需的最小子视图,搜索栏应位于该视图之外。
答案 1 :(得分:4)
可能你的sbar对象正在释放,在这种情况下是一个自动释放对象,为什么?尝试将sBar声明为IBOutlet属性。在Interface Builder中创建apropiate链接,在编码时删除alloc,放入viewDidUnload self.sbar = nil; 并将其发布为dealloc。在viewDidLoad中放了这个。
sBar.delegate = self;
sBar.showsCancelButton = YES; // this is an option in object inspector
[self.view addSubview:sBar];
[sBar becomeFirstResponder]; //remove this.
告诉我它是否有效
答案 2 :(得分:1)
试试这个:
sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)];
sBar.delegate = self;
sBar.showsCancelButton = YES;
[self.view addSubview:sBar];
并尝试将版本放入dealloc
答案 3 :(得分:1)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == self.searchDisplayController.searchResultsTableView)
{
[self.searchDisplayController setActive:NO animated:YES];
[self.searchDisplayController.searchBar resignFirstResponder];
}
}