2014-09-20 11 views
6

अद्यतन प्रदर्शित नहीं करेगा। अगर कोई भी समान खींचना चाहेगा और देखें कि क्या वे गलत हो गए हैं, जहां मैं गलत हो गया हूं, तो मैं निश्चित रूप से इसकी सराहना करता हूं। देखने के लिए बहुत अधिक कोड नहीं है। सार्वजनिक रेपो यहां: https://github.com/reidnez/NSAttributedStringBugDemoNSMutableAttributedString विशेषता है कि अशून्य सूचकांक में शुरू होता है

मुझे यहां एक बहुत ही अजीब समस्या है: मेरे पास एक टेबलव्यू है। प्रत्येक सेल में शीर्षक लेबल 1-3 शब्दों के साथ लेबल होता है, और कीवर्ड कई CSV कीवर्ड वाले लेबल होते हैं। मेरे पास एक खोज बार भी है। आवश्यकता यह है कि जब उपयोगकर्ता खोज बार में टाइप करता है, तो प्रत्येक सेल के लिए शीर्षक और कीवर्ड दोनों पर कोई आंशिक मिलान हाइलाइट किया जाता है। स्क्रीनशॉट:

Everything looks as it should searching on "Fa"

"an" highlights keyword, but not title

पहले छवि ए-ठीक है। दूसरी छवि में, शीर्षक लेबल के "ए" को हाइलाइट किया जाना चाहिए। लेकिन, जैसा कि आप देख सकते हैं, इतना नहीं ...

यह "कीवर्ड" लेबल पर बिल्कुल ठीक काम करता है, जैसा कि आप ऊपर देख सकते हैं। इन दोनों लेबलों के लिए जिम्मेदार तार एक श्रेणी द्वारा बनाए गए हैं (नीचे कोड)। दोनों विधिओं पर एक ही विधि को बुलाया जाता है, और ऐसा लगता है कि डीबगर मुझे क्या बता रहा है उससे वही व्यवहार करता है। यूआई एक अलग कहानी बताता है।

मैंने कई बार डीबगर के माध्यम से कदम रखा है, और सभी मामलों में, जिम्मेदार स्ट्रिंग सही तरीके से कॉन्फ़िगर किया गया है। मैंने यह भी सत्यापित किया है कि कुछ और [tableView reloadData] पर कॉल नहीं कर रहा है और मेरे कोड में कोई अन्य स्थान लेबल के मान को ओवरराइट कर रहा है। यह कैसे पर मिलान है "एक" "फेंग" के लिए डीबगर में लग रहा है, बस से पहले सेल cellForRowAtIndexPath के अंत में दिया जाता है:

(lldb) po customCell.entryTitleLabel.attributedText 
F{ 
}an{ 
NSBackgroundColor = "UIDeviceRGBColorSpace 0.533333 0.835294 0.156863 1"; 
}g{ 
} 

मेरे लिए अच्छा लग रहा है ... कि वास्तव में मैं क्या चाहता हूँ। लेकिन जब सेल प्रस्तुत करता है, तो देखने के लिए कोई हाइलाइट नहीं होता है! Weirder अभी तक एक प्रयोग मैं एक पूरी तरह से मनमाने ढंग से attributedString कि मैं सही cellForRow में बनाया करने के लिए लेबल की स्थापना की कोशिश की,:

NSMutableAttributedString *fake = [[NSMutableAttributedString alloc] initWithString:@"Fang"]; 
      [fake addAttribute:NSBackgroundColorAttributeName value:MATCH_TEXT_HILIGHT_COLOR range:NSMakeRange(1, 2)]; 
      customCell.entryTitleLabel.attributedText = fake; 

यह भी विफल रहता है। बिल्कुल कोई हाइलाइट नहीं है ... लेकिन मैं {0, 1} से {0, fake.length} की सीमा में किसी भी सबस्ट्रिंग को हाइलाइट कर सकता हूं और यह अपेक्षित व्यवहार करता है। फिर से, ऐसा लगता है कि यह किसी भी सबस्ट्रिंग को हाइलाइट करने से इंकार कर देता है जो इंडेक्स 0 से शुरू नहीं होता है - लेकिन केवल शीर्षक लेबल के लिए।

क्या मैं अपना दिमाग खो रहा हूं? मैं क्या खो रहा हूँ?

नीचे मेरी श्रेणी है ... लेकिन मुझे पूरी तरह से विश्वास है कि समस्या यहां झूठ नहीं बोलती है, क्योंकि यह कीवर्ड स्ट्रिंग के लिए पूरी तरह से काम करती है, और (फिर) गुण सेल रिटर्न से ठीक पहले ठीक से सेट होने लगते हैं:

-(void)hilightMatchingSubstring:(NSString*)substring color:(UIColor*)hilightColor range:(NSRange)range 
{ 
    if ([self.string compare:substring options:NSCaseInsensitiveSearch] == NSOrderedSame) { 
     [self addAttribute:NSBackgroundColorAttributeName value:hilightColor range:NSMakeRange(0, self.length)]; 
     return; 
    } 

    // Sanity check. Make sure a valid range has been passed so that we don't get out-of-bounds crashes. Default to return self wrapped in an attributed string with no attributes. 
    NSRange selfRange = NSMakeRange(0, self.length); 
    if (NSIntersectionRange(selfRange, range).length == 0) { 
     NSLog(@" \n\n\n*** Match range {%lu, %lu} does not intersect main string's range {%lu, %lu}. Aborting *** \n\n\n", (unsigned long)range.location, (unsigned long)range.length, (unsigned long)selfRange.location, (unsigned long)selfRange.length); 
     return; 
    } 

    if (substring.length > 0) { 
     NSRange movingRange = NSMakeRange(range.location, substring.length); 
     if (NSMaxRange(movingRange) > self.length) { 
      return; 
     } 

     NSString *movingString = [self.string substringWithRange:movingRange]; 

     while (NSMaxRange(movingRange) < NSMaxRange(range)) { 
      if ([movingString compare:substring options:NSCaseInsensitiveSearch] == NSOrderedSame) { 
       [self addAttribute:NSBackgroundColorAttributeName value:hilightColor range:movingRange]; 
      } 
      movingRange = NSMakeRange(movingRange.location + 1, substring.length); 
      movingString = [self.string substringWithRange:movingRange]; 
     } 
    } // This is fine...string leaves properly attributed. 
} 
+0

कोई टिप्पणी के साथ डाउनवोट? बहुत धन्यवाद। सुपर रचनात्मक! मैं फिर से ऐसा नहीं करूँगा ... जो कुछ भी मैंने किया है? –

+2

मैं तालिका दृश्य कक्षों के लेबल के साथ एक ही चीज़ देख रहा हूं। मैं पाठ की शुरुआत को रेखांकित कर सकता हूं लेकिन मध्य में नहीं। मैं सुझाव देता हूं कि एक साधारण छोटा परीक्षण ऐप बनाना और एप्पल को बग रिपोर्ट के साथ सबमिट करना। – rmaddy

+0

"यह ऐप्पल की बग है" हमेशा मेरा अंतिम उपाय का जवाब है ... मुझे वास्तव में खुद को साबित करना है कि यह मामला है (अधिक संभावना है कि थोड़ा-ओले-मैंने कहीं गलती की है)। लेकिन यदि आपने एक समान समस्या का अनुभव किया है, तो यह वास्तव में सही निष्कर्ष हो सकता है। स्टैंडअलोन टेस्ट-एप एक अच्छा विचार है, मैं ऐसा करूँगा। धन्यवाद! –

उत्तर

2

इसे लिखने के लिए धन्यवाद ... सोचा था कि मैं भी पागल हो रहा था!

मैं एक वर्कअराउंड (पढ़ा: हैक) के साथ आया जब हम ऐप्पल से कुछ अधिकारी की प्रतीक्षा करते थे।

NSDictionary *hackAttribute = [NSDictionary dictionaryWithObjectsAndKeys: 
          [UIColor clearColor], NSBackgroundColorAttributeName, nil]; 

NSMutableAttributedString *attributedText = 
    [[NSMutableAttributedString alloc] initWithString:@"some text..."]; 
    [attributedAddressText setAttributes:hackAttribute range:NSMakeRange(0, attributedText.length)]; 
// Then set your other attributes as per normal 

आशा है कि मदद करता है।

+0

धन्यवाद! मैंने वास्तव में इसे बहुत पहले ठीक करने पर छोड़ दिया और अन्य चीजों पर काम करना शुरू कर दिया। लेकिन ... जैसे ही मैं घर आता हूं, मैं इसका परीक्षण करूंगा और (यह मानता है कि यह काम करता है) अपना जवाब स्वीकार करें। –

+0

यह हैक मेरे लिए काम किया .. –

+0

@ReidBelton: lemme पता है कि यह कैसे जाता है :) –

संबंधित मुद्दे