У меня есть UITextField, который я добавляю к UITableViewCell
для использования в качестве поля поиска для длинного списка учетных записей.Я добавил его следующим образом:
- (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];
}
}
Чтобы обнаружить изменения в текстовом поле, я установил UITextFieldDelegate
в заголовке и перехватывал следующие вызовы делегатов:
@interface AccountViewController : UITableViewController <UITextFieldDelegate> {
BOOL hasSearch;
UITextField *searchField;
...
}
В реализации я затем обрабатываю следующие методы делегата:
- (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;
}
Однако во втором случае, если я не верну YES, текст никогда не изменится;во-первых, возвращение ДА, кажется, не влияет на меня.Но когда я возвращаю YES либо, я получаю неприятный EXC_BAD_ACCESS
.
Я, должно быть, что-то упускаю в своем ручном добавлении этого UITextField в свою ячейку, но я не могу понять, что это ...кто-нибудь может помочь?
Большое спасибо.
РЕДАКТИРОВАТЬ: Как предложено ниже, я закомментировал вызов filterAccounts, и мое приложение больше не падает.Вот полный код этого метода:
- (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];
}
Я немного смущен.Когда я фильтрую этот список, используя textFieldShouldReturn, а затем возвращаю NO, он фильтруется правильно и не падает.Кое-что о возврате ДА любым из этих методов вызывает сбой после того, как я отфильтровал.Если я вообще не фильтровал, возвращать YES не проблема.
Дайте мне знать, есть ли другой код, который я должен опубликовать.