iPhone cellforrowatindexpath发出两个nsarray

时间:2011-08-15 15:27:46

标签: iphone uitableview

以下是我的代码:

- (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,如:

  • 2011-08-15 17:21:24.481 Enne1 [4750:207]否则成功?
  • 2011-08-15 17:21:24.483 Enne1 [4750:207]否则成功?
  • 2011-08-15 17:21:24.484 Enne1 [4750:207]否则成功?
  • 2011-08-15 17:21:24.485 Enne1 [4750:207]否则成功?

当我使用searchBar过滤单词时,还会显示4个NSLog:

  • 2011-08-15 17:19:33.713 E1 [4744:207]若成功?
  • 2011-08-15 17:19:33.714 E1 [4744:207]若成功?
  • 2011-08-15 17:19:33.714 E1 [4744:207]若成功?
  • 2011-08-15 17:19:33.715 E1 [4744:207]若成功?

但是当我使用searchBar然后使用Cancel或Search清除searchText然后点击“更改按钮”后,只显示1个NSLog,如下所示: 2

  • 011-08-15 17:21:49.806 E1 [4750:207]若成功?

应该是

  • 其他成功

    为了显示完整列表,而不是

  • 如果成功

我错过了什么吗?

编辑15 8月: 我试过了

if(mySearchBar.text.length > 0)

同样,但是当我清除搜索字符串时,tableview没有显示任何内容,而且只显示了两个nslog,即:

  • 2011-08-15 23:49:06.624 E1 [5064:207]若成功?
  • 2011-08-15 23:49:06.626 E1 [5064:207]若成功?

顺便说一句,为什么每次我在搜索栏中输入一个字母时它会显示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。

3 个答案:

答案 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 ...


编辑16月8日:

每次启动应用程序时都会显示4个nslog,因为有4个可见的单元格。我的tableview.height为100,所以当我将其更改为50时,会显示8个nslogs以及8个可见单元格。