Iphone UISearchBar委托未响应取消按钮

Iphone UISearchBar委托未响应取消按钮,iphone,objective-c,ios4,uisearchbardelegate,Iphone,Objective C,Ios4,Uisearchbardelegate,我有一个UIViewController,它是一个UISearchBarDelegate和一个MKMapViewDelegate。searchBarSearchButtonClicked事件工作正常,但在iOS 4.2中进行测试时,在点击取消按钮时,永远不会调用searchBarCancelButtonClicked。在4.3中,一切正常。我有其他相同代码的视图,它工作得很好。我已经三次检查了方法签名 这可能与MapView有关,还是我做错了什么 我的.h文件: @interface MyVie

我有一个
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
方法:

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
searchBar.hidden = YES;
}

有人知道为什么会发生这种情况吗?

可能您的sbar对象正在释放,在这种情况下是自动释放对象,为什么?。尝试将sBar声明为IBOutlet属性。在Interface Builder中创建一个类似的链接,在编写代码时删除alloc,然后放入viewDidUnload self.sbar=nil; 并在Dealoc中发布。在视图中,请将此放置

sBar.delegate = self;
sBar.showsCancelButton = YES; // this is an option in object inspector
[self.view addSubview:sBar];
[sBar becomeFirstResponder]; //remove this.
告诉我它是否有效

试试这个:

sBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320.0, 70.0)];

sBar.delegate = self;

sBar.showsCancelButton = YES;

[self.view addSubview:sBar];

试着把释放放在dealloc中

我遇到了完全相同的问题。按住“取消”按钮几秒钟有效

原因是我在tableview中实现了UITapGestureRecognitor。因此,它优先于搜索栏中的按钮单击或“x”按钮单击


在我的例子中,解决方案是将手势识别仅限于tableview的背景视图。我想类似的事情也会发生在你身上。尝试将手势识别器限制为所需的最小子视图,搜索栏应位于该视图之外

我刚刚注意到一件事:如果我点击并按住取消按钮3-4秒,它就会工作……有什么想法吗?听起来像是一个框架错误。你能上传一个最小的.xcproj让我看看发生了什么吗?是的,我已经试过了,没有骰子。问题是,它可以在其他view controller屏幕上正常工作,并且可以在iOS 4.3中正常工作。另外,正如我之前发布的,按住取消按钮几秒钟会使它工作。回答得很好,非常感谢!非常感谢。这正是我的问题。我有一个收藏视图。我将轻触手势限制在背景视图中,效果很好。再次感谢。我没有任何额外的手势识别器,取消按钮仍然不会触发其委托方法。尽管这种轻拍和握拍的方式对我有效,但我不能依赖这种行为。无论如何,谢谢你的提示:-)+1
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        [self.searchDisplayController setActive:NO animated:YES];
        [self.searchDisplayController.searchBar resignFirstResponder];
    }
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        [self.searchDisplayController setActive:NO animated:YES];
        [self.searchDisplayController.searchBar resignFirstResponder];
    }
}