5 Stimmen

Wird die UISearch-Leiste nicht beachtet?

In einer Tabellenansicht habe ich eine UISearchBar eingerichtet, den Delegate festgelegt und das Protokoll hinzugefügt.

Wenn ein Benutzer auf ein Wort tippt, ist alles in Ordnung, außer dass die Suche nach "tennis" sich von "Tennis" unterscheidet.

Wie kann ich die Suchleiste zu einer nicht-schreibfallbezogenen UISearchBar machen? Hier ist mein Code, wo ich denke, dass alles passiert:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
 [tableData removeAllObjects];// Alle Daten löschen, die zur vorherigen Suche gehörten
 if([searchText isEqualToString:@""]||searchText==nil){
  [myTableView reloadData];
  return;
 }
 NSInteger counter = 0;
 for(NSString *name in dataSource)
 {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
  NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];
  if(r.location != NSNotFound)
   [tableData addObject:name];
  counter++;
  [pool release];
 }
 [myTableView reloadData];
}

14voto

Noah Witherspoon Punkte 56607

Der einfachste Weg, dies zu tun, ist wahrscheinlich

 NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];

2voto

Sabby Punkte 2556

Versuchen Sie das.

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [DetailSearchArray removeAllObjects];// Entfernen Sie alle Daten, die zur vorherigen Suche gehören

    if([searchText isEqualToString:@""]){
        [table reloadData];
        return;
    }

    NSInteger counter = 0;
    NSArray *result = [[NSArray alloc] initWithArray:[resultArray filteredArrayUsingPredicate:predicate]];

    for (NSString *name in  resultArray  ) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
        NSRange r = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];
        //NSRange r=[name rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
        if(r.location != NSNotFound)
        {
            if(r.location== 0)//d.h. wir überprüfen nur den Anfang der Namen.
            {
                [DetailSearchArray addObject:name]; 
            }
        }

        }
        counter++;
        [pool release];
    }

    [table reloadData];
}

1voto

RickiG Punkte 11320

Wenn Sie den Vergleich durchführen, versuchen Sie es mit der Kleinbuchstaben-Version zu machen.

NSRange r = [[name lowercaseString] rangeOfString:[searchText lowercaseString]];

Nur zur Klarstellung, das ändert keine der Werte, sondern gibt nur eine Kleinbuchstaben-Version des Originals zurück, die Sie dann zum Vergleich verwenden.

0voto

kalpaitch Punkte 5135

Es gibt eine 'lowercaseString'-Funktion, weiß nicht, woher ich das habe, da ich nichts mit iPhones zu tun habe. Ich bin mir sicher, wenn Sie danach googeln, finden Sie etwas.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X