2011-07-11 10 views
5

Mam UITextField, który dodaję do UITableViewCell, aby użyć go jako pola wyszukiwania dla długiej listy kont. Dodałem ją następująco:UITextField - zawieszanie się na delegatach, które zwracają BOOL

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    if ((indexPath.section < accountsection) && (hasSearch) && (indexPath.row == 0)) 
    { 
     // Search 
     if (!searchField) 
     { 
      searchField = [[UITextField alloc] initWithFrame:CGRectMake(20, 10, cell.frame.size.width - 40, 25)]; 
      [searchField setEnabled:YES]; 
      searchField.placeholder = NSLocalizedString(@"Search", @"search"); 
      searchField.keyboardType = UIKeyboardTypeDefault; 
      searchField.returnKeyType = UIReturnKeySearch; 
      searchField.autocorrectionType = UITextAutocorrectionTypeNo; 
      searchField.clearButtonMode = UITextFieldViewModeAlways; 
      searchField.delegate = self; 
      [cell addSubview:searchField]; 
      [searchField release]; 
     } 

     // Clean up an account label if needed 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.textLabel.text = @""; 
     cell.detailTextLabel.text = @""; 

     // Show the search field if it was hidden by a text label 
     searchField.hidden = NO; 
     [cell bringSubviewToFront:searchField]; 
    } 
} 

Aby wykryć zmiany w polu tekstowym, mam skonfigurować UITextFieldDelegate w nagłówku i pułapki wywołuje następujące Delegat:

@interface AccountViewController : UITableViewController <UITextFieldDelegate> { 
    BOOL hasSearch;  
    UITextField *searchField; 
... 
} 

W realizacji, ja następnie wykonaj następujące delegowane metody:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    NSLog(@"Done editing"); 
    [self filterAccountsBy:textField.text]; 
    [textField resignFirstResponder]; 
    return NO; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSLog(@"Searching for %@", string); 
    [self filterAccountsBy:string];  
    return YES; 
} 

Jednak w drugim, chyba że zwrócę TAK, tekst nigdy się nie zmieni; w pierwszym powracającym TAK wydaje się nie wpływać na mnie. Ale kiedy wrócę TAK, dostaję paskudną EXC_BAD_ACCESS.

Muszę zabraknąć czegoś w moim ręcznym dodawaniu tego UITextField do mojej komórki, ale nie mogę wymyślić co to jest ... czy ktoś może pomóc?

Wielkie dzięki.


EDIT: Jak sugeruje poniżej, wypowiedziało się filterAccounts zadzwonić i moja aplikacja już nie wywala. Oto pełny kod dla tej metody:

- (void)filterAccountsBy:(NSString *)filterstring 
{ 
    [accounts removeAllObjects]; 
    if (([filterstring length] == 0) && (!isChooser) && (![vpmsConn isDomainLogon])) { 
     [accounts addObject:[[vpmsConn accounts] objectAtIndex:0]]; 
    } 

    if ([filterstring length] == 0) { 
     [accounts addObjectsFromArray:[cache accounts]]; 
    } else { 
     for (AccountItem *ac in [cache accounts]) 
     {   
      BOOL found = NO; 

      // Name search 
      if ([[ac.clientName uppercaseString] rangeOfString:[filterstring uppercaseString]].location != NSNotFound) { 
       found = YES; 
      } 

      //more similar searches 

      if (found) { 
       [accounts addObject:ac]; 
      } 
     } 
    } 

    [self.tableView reloadData]; 
} 

Jestem jednak nieco zdezorientowany. Kiedy filtruję tę listę za pomocą textFieldShouldReturn, a następnie zwracam NO, to filtruje się prawidłowo i nie ulega awarii. Coś o powrocie TAK z jednej z tych metod powoduje awarię po tym, jak ją przefiltrowałem. Jeśli w ogóle nie filtrowałem, zwrot TAK nie stanowi problemu.

Daj mi znać, jeśli jest jakiś inny kod, który powinienem opublikować.

+0

Co to jest "filterAccountsBy:"? Czy to się zawiesza, jeśli to skomentujesz? – albertamg

+0

Ta metoda po prostu filtruje konta według dostarczonego tekstu; w zasadzie robi to dla NSMutableArray: usuwa wszystkie obiekty, następnie dodaje nowe, a następnie wywołuje reloadData w widoku tabeli, który używa tej tablicy jako źródła danych. – hocker

+0

Jednak, jak przypuszczasz, to faktycznie zawiesza się, gdy metoda jest włączona i nie jest, gdy jest ona komentowana. Co mnie zastanawia teraz, co ta metoda robi źle. Opublikuję powyższy kod metody. – hocker

Odpowiedz

0

Rozwiązałem problem, ale nie mogę (z powodu NDA) zamieścić tutaj odpowiedzi. Zainteresowani, w płatnym programie dla programistów iOS, powinni przejść na fora deweloperów NDA i wyszukać UITextField EXC_BAD_ACCESS, a znajdziecie odpowiedź ...

0

Myślę, że UITextFieldsearchfield jest rozpocząć zwalniane. Jeśli użyjesz self.searchField do ustawienia twojego searchfield (zakładając, że jest to własność zachowana), to rozwiąże to.

Nie jestem pewien, jak wygląda reszta twojego .h. Można zrobić:

@property (nonatomic, retain) UITextField *searchField; 

Następnie w .m:

@synthesize searchField; 

To co mam na myśli, dokonując wyszukiwania Pole A zachowana właściwość. W ten sposób twoja klasa utrzyma pole wyszukiwania.

+0

Próbowałem tego i nie ma to żadnego efektu. Od edycji poprzedniego komentatora coś się dzieje z moją logiką filtru. Zamierzam edytować oryginalne pytanie, aby dodać ten kod ... – hocker

+0

Po włączeniu zombie powinieneś być w stanie dowiedzieć się, do którego obiektu odwołuje się po zwolnieniu. To powinno pomóc ci zawęzić problem (http://stackoverflow.com/questions/2190227/how-do-i-set-nszombieenabled-in-xcode-4) –

+0

Faktycznie, włączyłem zombie dokładnie tak, jak opisuje to łącze - Xcode 4 po prostu niepotrzebnie zrzuca mnie przy funkcji main(). Wrzucę ślad śledzenia powyżej ... – hocker

0

w

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

gdzie jest

return cell; 

?

0

W - (UITableViewCell *) tableView (UITableView *) tableView cellForRowAtIndexPath (NSIndexPath *) indexPathreturn cell;

Donot uwalnianiu serachfield w przypadku;

Uwolnienie w dealloc

dodatek @property (nonatomic zachowują) UITextField * searchField;

Powiązane problemy