以下是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row = [indexPath row];
NSString *contentForThisRow = nil;
NSString *contentForThisRow2 = nil;
if (mySearchBar.text > 0)
{
contentForThisRow = [self.filteredListContent objectAtIndex:row];
NSInteger noWordIndex = [self.noWords indexOfObject:contentForThisRow];
contentForThisRow2 = [self.enWords objectAtIndex:noWordIndex];
NSLog (@"if success?");
}
else
{
contentForThisRow = [self.noWords objectAtIndex:row] ;
contentForThisRow2 = [self.enWords objectAtIndex:row];
NSLog (@"else success?");
}
static NSString *kCellID = @"cellID";
//standard code here etc for this method..
}
上述代码完美无缺,除非我使用searchBar进行过滤,然后单击键盘中搜索栏或搜索按钮中的取消按钮,然后当我单击导航栏中的自定义“更改”按钮时,应用程序崩溃
在我使用searchBar之前,每次更改后会显示4个NSLog,如:
当我使用searchBar过滤单词时,还会显示4个NSLog:
但是当我使用searchBar然后使用Cancel或Search清除searchText然后点击“更改按钮”后,只显示1个NSLog,如下所示: 2
应该是
其他成功
为了显示完整列表,而不是
如果成功
我错过了什么吗?
编辑15 8月: 我试过了
if(mySearchBar.text.length > 0)
同样,但是当我清除搜索字符串时,tableview没有显示任何内容,而且只显示了两个nslog,即:
顺便说一句,为什么每次我在搜索栏中输入一个字母时它会显示4个nslog?它不应该每次只显示一个nslog吗?
我的textDidChange代码是:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchString
{
NSLog (@" ss: %@", searchString);
if ([searchString length] == 0) {
[self performSelector:@selector(hideKeyboardWithSearchBar:) withObject:searchBar afterDelay:0];
NSLog (@" searchstring: %@", searchString);
}
[self filterContentForSearchText:searchString];
[tableView reloadData];
NSLog (@"has reloaded!");
return;
}
编辑15 8月;这是错误的:我怀疑上面的代码导致应用程序崩溃?没有正确重新加载tableview? 我对吗?搜索的NSLog没有显示任何内容......
第二次编辑15月8日:我添加了NSLog(@“ss:%@”,searchString);当然,每当我输入一个字母表时,它会显示字母表。所以mySearchBar.text>一定有问题。 0,我该怎么写这个呢?
顺便说一下,我以编程方式添加了tableview和searchbar,tableviews委托和数据源链接到self,searchbars委托也链接到self。 InterfaceBuilder中没有任何内容,只有UIView。
答案 0 :(得分:1)
不确定您正在尝试使用
if(mySearch.text > 0) {
//stuff
}
看起来,就像你正在尝试比较长度以查看字符串是否为空。请尝试使用此代码:
if([mySearchBar text] == nil || ![[mySearchBar text] isEqualToString:@""]) {
//stuff
}
进入此代码块可能是问题所在。不确定你的对象是如何实现的,但是如果过滤后的列表是nil,那么你会试图从中获取对象而不会失败。
答案 1 :(得分:0)
你绝对应该使用if(mySearchBar.text.length> 0),而不是if(mySearchBar.text> 0)。
这可能会崩溃:
contentForThisRow2 = [self.enWords objectAtIndex:noWordIndex];
因为前一行中的noWordIndex为-1(即2147483647)。即使您只输入noWords数组中不存在的单词,它也会以这种方式崩溃,因此您需要在使用它来访问enWords之前检查noWordIndex是否为> = 0。这也可能解决了清理搜索文本的问题。
顺便说一句,查找单词的更快的方法是使用NSDictionary而不是两个数组。
答案 2 :(得分:0)
啊,我通过向mySearchBar.text添加length
解决了这个问题。 mySearchBar.text.length > 0
有效。我忘了用另一种方法重写,我将mySearchBar.text
更改为mySearchBar.text.length
,即:
- (NSInteger)tableView:(UITableView *)tableView1 numberOfRowsInSection:(NSInteger)section
{
tableView1.rowHeight = 100 ;
tableView1.separatorColor = [UIColor colorWithRed:0.40 green:0.70 blue:0.45 alpha:1.0];
tableView1.opaque = NO;
if (mySearchBar.text.length > 0)
{
return [self.filteredListContent count];
NSLog (@"if return");
}
else
{
return [self.noWords count];
NSLog (@"else return");
}
}
@Daniel R希克斯 和 @ColdLogic:所以你是对的,只使用mySearchBar.text是错误的。非常感谢你指点我正确的方向。
但我仍然想知道为什么每次都会出现4个nslog ...
每次启动应用程序时都会显示4个nslog,因为有4个可见的单元格。我的tableview.height为100,所以当我将其更改为50时,会显示8个nslogs以及8个可见单元格。