iPhone cellforrowatindexpath выдает два nsarray - PullRequest
1 голос
/ 15 августа 2011

Вот мой код ниже:

- (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, а затем очистил searchText либо с помощью кнопки Отмена, либо Поиск, а затем нажал кнопку «Изменить», отображается только 1 NSLog, например: 2

  • 011-08-15 17: 21: 49.806 E1 [4750: 207] в случае успеха?

должно быть

  • иначе успех

    для отображения полных списков, а не

  • в случае успеха

.

Я что-то упустил?

РЕДАКТИРОВАТЬ 15 августа: Я пытался

if(mySearchBar.text.length > 0)

также, но табличное представление ничего не показывает, когда я очищаю строку поиска, и появилось только 2 nslogs, то есть:

  • 2011-08-15 23: 49: 06.624 E1 [5064: 207] если успех?
  • 2011-08-15 23: 49: 06.626 E1 [5064: 207] если успех?

Кстати, почему он показывает 4 nslogs каждый раз, когда я вводю один алфавит в строке поиска? Разве он не должен показывать только один 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 августа; Это неправильно: я подозреваю, что приведенный выше код вызывает сбой приложения? не перезагружаешь таблицу как надо? Я прав? NSLog для searchString ничего не показал ...

2-е редактирование 15 августа: я добавил NSLog (@ "ss:% @", searchString); и, конечно, он показывает алфавит (ы) каждый раз, когда я ввожу один алфавит. Так что должно быть что-то не так с mySearchBar.text> 0, как мне написать это правильно?

Между прочим, я программно добавил tableview и searchbar, делегат tableviews и источник данных связан с self, а делегат searchbars также связан с self. В InterfaceBuilder ничего нет, только UIView.

Ответы [ 3 ]

1 голос
/ 15 августа 2011

Не совсем уверен, что вы пытаетесь с

if(mySearch.text > 0) {
    //stuff
}

Похоже, вы пытаетесь сравнить длину, чтобы увидеть, пуста ли строка. Попробуйте использовать это вместо:

if([mySearchBar text] == nil || ![[mySearchBar text] isEqualToString:@""]) {
    //stuff
}

Возможно, проблема в том, чтобы попасть в этот блок кода. Не знаю, как реализованы ваши объекты, но если отфильтрованный список равен нулю, вы потерпите крах, пытаясь получить объекты из него, а что нет.

0 голосов
/ 16 августа 2011

Ах, я решил это, добавив length к mySearchBar.text; 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");
    }

}

@ Даниэль Р Хикс а также @ColdLogic: Итак, вы оба правы, что неправильно использовать только mySearchBar.text. Большое спасибо за то, что указали мне правильное направление.

Но мне все еще интересно, почему каждый раз появляется 4 nslogs ...


РЕДАКТИРОВАТЬ 16 августа:

Каждый раз, когда я запускаю приложение, появляются 4 nslogs, потому что есть 4 видимые ячейки. Мой tableview.height равен 100, поэтому, когда я изменил его на 50, появляются 8 журналов и 8 видимых ячеек.

0 голосов
/ 16 августа 2011

Вы обязательно должны использовать if (mySearchBar.text.length> 0), а не if (mySearchBar.text> 0).

Вероятно, здесь происходит сбой:

contentForThisRow2 = [self.enWords objectAtIndex:noWordIndex];

потому что noWordIndex был -1 (т.е. 2147483647) в предыдущей строке. Это приведет к сбою, даже если вы просто введете слово, которого нет в массиве noWords, поэтому вам нужно проверить, равен ли noWordIndex> = 0, прежде чем использовать его для доступа к enWords. Это, вероятно, решит проблему с очисткой текста поиска.

Кстати, гораздо более быстрый способ поиска слов будет использовать NSDictionary вместо двух массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...