UISearchBar委托没有响应取消按钮

时间:2011-05-14 19:58:37

标签: iphone objective-c ios4 uisearchbardelegate

我的UIViewControllerUISearchBarDelegateMKMapViewDelegatesearchBarSearchButtonClicked事件工作正常,但在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;
}

有没有人知道为什么会这样?

4 个答案:

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