UITextField - сбой делегатов, возвращающих BOOL - PullRequest
5 голосов
/ 11 июля 2011

У меня есть 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 не проблема.

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

Ответы [ 4 ]

0 голосов
/ 19 декабря 2011

In - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath return cell;

Не выпускать serachfield в событии;

Release в dealloc

add @property (nonatomic, retain) UITextField * searchField;

0 голосов
/ 12 июля 2011

Я решил проблему, но не могу (из-за NDA) опубликовать ответ здесь.Те, кто заинтересован, и в платной программе для разработчиков iOS, должны посетить форумы разработчиков NDA и найти UITextField EXC_BAD_ACCESS, и вы найдете ответ ...

0 голосов
/ 16 декабря 2011

в

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

где

return cell;

0 голосов
/ 12 июля 2011

Я думаю, что ваши UITextField searchfield начинают освобождаться. Если вы используете self.searchField для установки searchfield (при условии, что это сохраняемое свойство), это решит его.

Я не уверен, как выглядят остальные твои .h . Вы могли бы сделать:

@property (nonatomic, retain) UITextField *searchField;

Тогда в .m :

@synthesize searchField;

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

...