2011-07-11 15 views
5

लौटाते हैं मेरे पास एक UITextField है जिसे मैं UITableViewCell में जोड़ रहा हूं ताकि खातों की लंबी सूची के लिए खोज क्षेत्र के रूप में उपयोग किया जा सके। इस प्रकार मैं इसे जोड़ लिया है:,UITextField - प्रतिनिधियों पर क्रैश जो BOOL

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

कार्यान्वयन में मैं:

- (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 की स्थापना की है , दूसरा एक में

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

हालांकि जब तक कि मैं लौट हाँ, पाठ कभी नहीं बदलता, तब इन प्रतिनिधि तरीकों को संभालने पहले में, हाँ लौटने से मुझे प्रभावित नहीं होता है। लेकिन जब मैं यस में वापस आ जाता हूं, तो मुझे एक बुरा EXC_BAD_ACCESS मिलता है।

मुझे अपने सेल में इस यूआईटीएक्स्टफिल्ड को जोड़ने के मैनुअल में कुछ याद आना चाहिए, लेकिन मैं यह नहीं समझ सकता कि यह क्या है ... क्या कोई सहायता कर सकता है?

बहुत धन्यवाद।


संपादित करें: के रूप में नीचे का सुझाव दिया, मैंने टिप्पणी की बाहर 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 को वापस करने के बारे में कुछ करने के बाद मैंने फ़िल्टर किए जाने के बाद दुर्घटना का कारण बनता है। अगर मैंने बिल्कुल फ़िल्टर नहीं किया है, तो हाँ वापस लौटना कोई समस्या नहीं है।

मुझे बताएं कि कोई अन्य कोड है जो मुझे पोस्ट करना चाहिए।

+0

'फ़िल्टरअकाउंट्सबी:' क्या है? यदि आप इसे टिप्पणी करते हैं तो क्या यह दुर्घटनाग्रस्त हो जाता है? – albertamg

+0

वह विधि केवल प्रदान किए गए पाठ द्वारा खातों को फ़िल्टर करती है; यह मूल रूप से NSMutableArray के लिए निम्न कार्य करता है: सभी ऑब्जेक्ट्स को हटाएं, फिर नए को वापस जोड़ें, फिर तालिकादृश्य पर reloadData को कॉल करें जो उस सरणी को अपने डेटा स्रोत के रूप में उपयोग करता है। – hocker

+0

हालांकि, जैसा कि आप अनुमान लगाते हैं, यह वास्तव में क्रैश होता है जब विधि सक्षम होती है और जब इसे टिप्पणी नहीं की जाती है। जो मुझे आश्चर्यचकित करता है कि यह विधि गलत क्या कर रही है। मैं ऊपर पूरा विधि कोड पोस्ट करूंगा। – hocker

उत्तर

0

मैंने इस मुद्दे को हल किया है, लेकिन मैं अभी तक जवाब पोस्ट नहीं कर सकता (एनडीए के कारण)। रुचि रखने वाले, और भुगतान किए गए आईओएस डेवलपर प्रोग्राम में, एनडीए डेवलपर मंचों पर जाना चाहिए और UITextField EXC_BAD_ACCESS की खोज करनी चाहिए और आपको जवाब मिल जाएगा ...

0

मुझे लगता है कि आपके UITextFieldsearchfield को अस्वीकार कर दिया गया है। यदि आप अपने searchfield (मानते हैं कि यह एक बनाए रखा संपत्ति है) सेट करने के लिए self.searchField का उपयोग करें, जो इसे हल करेगा।

मुझे यकीन नहीं है कि आपके बाकी .h जैसा दिखता है। आप कर सकता है:

@property (nonatomic, retain) UITextField *searchField; 

फिर मीटर में:

@synthesize searchField; 

है यही कारण है कि मैं खोज क्षेत्र एक बनाए रखा संपत्ति बनाकर मतलब है। इस तरह आपकी कक्षा खोज क्षेत्र को चारों ओर रखेगी।

+0

मैंने कोशिश की और इसका कोई प्रभाव नहीं पड़ा। पिछले टिप्पणीकर्ता के संपादन से, मेरे फ़िल्टर तर्क के साथ कुछ हो रहा है। मैं इस कोड को जोड़ने के लिए मूल प्रश्न को संपादित करने जा रहा हूं ... – hocker

+0

यदि आप ज़ोंबी चालू करते हैं तो आपको यह पता लगाने में सक्षम होना चाहिए कि रिलीज होने के बाद किस वस्तु का संदर्भ दिया जा रहा है। इससे आपको समस्या को कम करने में मदद मिलनी चाहिए (http://stackoverflow.com/questions/2190227/how-do-i-set-nszombieenabled-in-xcode-4) –

+0

दरअसल, मैंने ज़ोंबी को ठीक उसी तरह सक्षम किया है जैसा कि लिंक वर्णन करता है - एक्सकोड 4 बस मुझे मुख्य() फ़ंक्शन पर असम्पी ढंग से डंप करता है। मैं उपरोक्त बैकट्रैक पोस्ट करूंगा ... – hocker

0

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

में

जहां

return cell; 

है?

0

में - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPathreturn cell;

घटना में

Donot रिहाई serachfield;

dealloc में रिलीज

ऐड @property (nonatomic, को बनाए रखने) UITextField * searchField;