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ć.
Co to jest "filterAccountsBy:"? Czy to się zawiesza, jeśli to skomentujesz? – albertamg
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
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