2014-10-12 31 views
8

Ho un UICollectionViewCell personalizzato con UITextView non modificabile e non selezionabile. Nel metodo cellForItemAtIndexPath: metodo, imposto la proprietà attributeText di UITextView e viene visualizzato correttamente con tutti gli attributi. Tuttavia, quando provo ad accedere a quel testo attribuito in un secondo momento (nel metodo di azione di un rilevatore di gesti di tocco), il valore è nullo.Il testo attribuito UITextView è nullo dopo essere stato impostato

Ecco ciò che il mio codice è simile:

View Controller:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    TNCommentCollectionViewCell *commentCell = [collectionView dequeueReusableCellWithReuseIdentifier:kCommentCellIdentifier 
                          forIndexPath:indexPath]; 

    TNComment *comment = [self.comments objectAtIndex:indexPath.row]; 
    commentCell.textView.attributedText = [self commentStringForComment:comment]; 

    return commentCell; 
} 

- (NSAttributedString *)commentStringForComment:(DAFeedComment *)comment 
{ 
    NSString *usernameString = [NSString stringWithFormat:@"@%@", comment.username]; 
    NSDictionary *usernameAttributes = @{ NSForegroundColorAttributeName : [UIColor usernameColor], 
      NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:14.0f] }; 
    NSAttributedString *attributedUsernameString = [[NSAttributedString alloc] initWithString:usernameString attributes:usernameAttributes]; 
    NSMutableAttributedString *labelString = [attributedUsernameString mutableCopy]; 

    NSDictionary *commentAttributes = @{ NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:14.0f] }; 
    [labelString appendAttributedString:[[NSAttributedString alloc] initWithString:@" "]]; 
    [labelString appendAttributedString:[[NSAttributedString alloc] initWithString:comment.comment attributes:commentAttributes]]; 

    return labelString; 
} 

Collezione vista di cella:

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    self.textView.textContainerInset = UIEdgeInsetsZero; 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textViewTapped:)]; 
    tapGesture.numberOfTapsRequired = 1; 
    [self.textView addGestureRecognizer:tapGesture]; 
} 

- (void)textViewTapped:(UITapGestureRecognizer *)recognizer 
{ 
    UITextView *textView = (UITextView *)recognizer.view; 

    NSLayoutManager *layoutManager = textView.layoutManager; 
    CGPoint location = [recognizer locationInView:textView]; 
    location.x -= textView.textContainerInset.left; 
    location.y -= textView.textContainerInset.top; 

    NSUInteger characterIndex = [layoutManager characterIndexForPoint:location 
                 inTextContainer:textView.textContainer 
          fractionOfDistanceBetweenInsertionPoints:nil]; 

    if(characterIndex < textView.textStorage.length) 
    { 
     NSLog(@"%@", textView.attributedText); 
    } 
} 

che porta ad una potenza di solo "(null)". Se stampo la proprietà text di UITextView, tuttavia, stamperà il testo attuale, ma non il testo attribuito.

Sto facendo qualcosa di sbagliato? Gradirei davvero qualsiasi aiuto

Grazie!

+0

Fare qualcosa di sbagliato? Sì, non hai incluso il codice per "commentStringForComment". –

+0

Modificato per includere il codice per quel metodo. Non l'ho incluso in origine perché sapevo già che il valore restituito era valido a causa del fatto che la stringa attribuita veniva visualizzata correttamente. – ryanthon

risposta

14

Ho avuto lo stesso problema. La soluzione per me era abilitare la proprietà selezionabile di UITextView nello storyboard. Dopo che tutto ha funzionato.

Speranza che aiuti

+2

Già, grazie! Ciò ha funzionato con un tweak. Ho contrassegnato il campo come selezionabile in IB, ma in fase di esecuzione (nel ViewDidLoad), ho modificato la proprietà Selectable del campo in NO. Quindi ottengo le decorazioni attribuite dal testo, ma il campo rimane non selezionabile durante l'esecuzione. – jbbenni

+2

Questo è un problema noto. Se ti senti così incline, segnala un bug all'indirizzo http://bugreport.apple.com e rimandi al bug # 15854592. –

+0

Solo una delle tante cose che dovremmo memorizzare perché Apple impiega programmatori sub-standard. Segnala una segnalazione di errore se hai ancora più tempo da perdere in quanto non prenderanno un po 'di preavviso. – amergin

Problemi correlati