UISearchBar委托未响应取消按钮

14

我有一个UIViewController,它是一个UISearchBarDelegateMKMapViewDelegate。在iOS 4.2中测试时,searchBarSearchButtonClicked事件可以正常工作,但是当点击取消按钮时,searchBarCancelButtonClicked从未被调用。在4.3中一切正常。我有其他视图具有相同的代码,并且它们可以正常工作。我已经三重检查了方法签名。

这可能与地图视图有关,还是我做错了什么?

我的.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;
}

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


我刚刚注意到一件事:如果我长按取消按钮超过3-4秒钟,它就会起作用...有什么想法吗? - user213517
1
听起来像是一个框架bug。你能上传一个最小的.xcproj文件,这样我就可以看出问题出在哪里了吗? - Andrew Pouliot
4个回答

22

我遇到了同样的问题。按住取消按钮几秒钟后问题得以解决。

问题出在我在表格视图中实现了UITapGestureRecognizer。因此,这个手势识别会优先于搜索栏中的按钮点击或“x”按钮点击。

我的解决方案是将手势识别限制在表格视图的背景视图中。我想你的情况可能类似。尝试将手势识别器限制在所需最小子视图上,而搜索栏应该位于该视图之外。


谢谢。这正是我的问题。我有一个集合视图。我将轻拍手势限制在背景视图上,它起作用了。再次感谢。 - Isuru
1
我没有任何额外的手势识别器,取消按钮仍然不能像应该的那样触发其委托方法。虽然长按对我有用,但我不能依赖这种行为。无论如何,谢谢你的提示 :-) +1 - jweyrich

4

可能您的sbar对象正在释放,这种情况下是一个自动释放对象,为什么?尝试将sBar声明为IBOutlet属性。在Interface Builder中进行适当的链接,在编写代码时删除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.

告诉我它是否有效。

是的,我已经尝试过了,但没有成功。问题是,在其他视图控制器屏幕上它可以正常工作,并且在iOS 4.3上也可以正常工作。此外,就像我之前发布的那样,长按取消按钮几秒钟后它就可以正常工作。 - user213517

1

试试这个:

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

sBar.delegate = self;

sBar.showsCancelButton = YES;

[self.view addSubview:sBar];

尝试在dealloc中放置释放


1
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        [self.searchDisplayController setActive:NO animated:YES];
        [self.searchDisplayController.searchBar resignFirstResponder];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接