2011-07-11 23 views
5

Tôi có một UITextField mà tôi đang thêm vào một UITableViewCell để sử dụng làm trường tìm kiếm cho một danh sách dài các tài khoản. Tôi đã thêm nó như sau:UITextField - sự cố đối với các đại biểu trả lại 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]; 
    } 
} 

Để phát hiện chỉnh sửa đến lĩnh vực văn bản, tôi đã thiết lập các UITextFieldDelegate trong tiêu đề và bẫy các đại biểu sau đây gọi:

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

Trong việc thực hiện, tôi sau đó xử lý các phương thức ủy nhiệm này:

- (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; 
} 

Tuy nhiên, trong trường hợp thứ hai, trừ khi tôi trả lại CÓ, văn bản không bao giờ thay đổi; trong lần đầu tiên, trả lại CÓ dường như không ảnh hưởng đến tôi. Nhưng khi tôi trả lại CÓ trong một trong hai, tôi nhận được một khó chịu EXC_BAD_ACCESS.

Tôi phải bỏ sót điều gì đó trong hướng dẫn thêm UITextField vào ô của mình nhưng tôi không thể hiểu được nó là gì ... ai có thể hỗ trợ không?

Rất cám ơn.


EDIT: Như đã đề cập dưới đây, tôi nhận xét ra các filterAccounts gọi và ứng dụng của tôi bây giờ không có tai nạn lâu hơn. Đây là mã đầy đủ cho phương pháp này:

- (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]; 
} 

Tôi hơi bối rối. Khi tôi lọc danh sách này bằng cách sử dụng textFieldShouldReturn và sau đó trả về NO, nó lọc đúng và không bị lỗi. Một cái gì đó về trả lại CÓ từ một trong những phương pháp này gây ra sự cố sau khi tôi đã lọc. Nếu tôi chưa lọc thì trả lại CÓ là không có vấn đề gì.

Hãy cho tôi biết nếu có bất kỳ mã nào khác mà tôi nên đăng.

+0

'filterAccountsBy:' là gì? Nó có sụp đổ nếu bạn bình luận không? – albertamg

+0

Phương pháp đó chỉ lọc các tài khoản theo văn bản được cung cấp; Về cơ bản nó làm như sau với NSMutableArray: loại bỏ tất cả các đối tượng, sau đó thêm các đối tượng mới trở lại, sau đó gọi reloadData trên tableview sử dụng mảng đó làm nguồn dữ liệu của nó. – hocker

+0

Tuy nhiên khi bạn phỏng đoán, nó thực sự sụp đổ khi phương pháp được kích hoạt và không khi nó được nhận xét. Điều này khiến tôi băn khoăn không biết phương pháp này đang làm gì sai. Tôi sẽ đăng mã phương thức hoàn chỉnh ở trên. – hocker

Trả lời

0

Tôi đã giải quyết vấn đề nhưng tôi không thể (do NDA) đăng câu trả lời ở đây. Những người quan tâm và trong chương trình nhà phát triển iOS có trả tiền, nên truy cập diễn đàn nhà phát triển NDA và tìm kiếm UITextField EXC_BAD_ACCESS và bạn sẽ tìm thấy câu trả lời ...

0

Tôi nghĩ rằng UITextFieldsearchfield của bạn sẽ bắt đầu được phân phối lại. Nếu bạn sử dụng self.searchField để đặt searchfield của bạn (giả sử đó là thuộc tính được giữ lại), điều đó sẽ giải quyết được.

Tôi không chắc chắn phần còn lại của .h của bạn trông như thế nào. Bạn có thể làm:

@property (nonatomic, retain) UITextField *searchField; 

Sau đó, trong .m:

@synthesize searchField; 

Đó là những gì tôi muốn nói bằng cách làm cho lĩnh vực tìm kiếm một tài sản được giữ lại. Bằng cách này, lớp học của bạn sẽ giữ cho trường tìm kiếm xung quanh.

+0

Tôi đã thử điều này và nó không có hiệu lực. Từ các chỉnh sửa của người bình luận trước, có điều gì đó đang xảy ra với logic bộ lọc của tôi. Tôi sẽ chỉnh sửa câu hỏi gốc để thêm mã này ... – hocker

+0

Nếu bạn bật zombie, bạn sẽ có thể tìm ra đối tượng nào đang được tham chiếu sau khi được phát hành. Điều này sẽ giúp bạn thu hẹp vấn đề (http://stackoverflow.com/questions/2190227/how-do-i-set-nszombieenabled-in-xcode-4) –

+0

Thực ra, tôi đã kích hoạt chính xác như liên kết mô tả - Xcode 4 chỉ vô tình đổ tôi vào hàm main(). Tôi sẽ đăng backtrace ở trên ... – hocker

0

trong

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

nơi là

return cell; 

?

0

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

donot phát hành serachfield trong trường hợp;

Phát hành trong dealloc

thêm @property (nonatomic, retain) UITextField * searchField;

Các vấn đề liên quan