2014-10-12 38 views
8

Mam niestandardową UICollectionViewCell z nie edytowalnym, nie do wybrania UITextView. W metodzie cellForItemAtIndexPath: ustawiam właściwość attributedText z UITextView, i wyświetla się dobrze ze wszystkimi atrybutami. Jednak gdy próbuję uzyskać dostęp do przypisanego tekstu później (w metodzie działania czytnika gestów dotykowych), wartość jest pusta.Przypisany tekst UITextView jest pusty po ustawieniu

Oto co mój kod wygląda następująco:

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

Kolekcja widok komórkowy:

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

która prowadzi do wyjścia po prostu "(null)". Jeśli jednak wydrukuję właściwość text UITextView, wydrukuje on tekst, ale nie tekst przypisany.

Czy robię coś nie tak? Naprawdę doceniam każdą pomoc

Dzięki!

+0

Czy coś nie tak? Tak, nie uwzględniłeś kodu dla 'commentStringForComment'. –

+0

Edytowane w celu uwzględnienia kodu dla tej metody. Nie uwzględniłem go pierwotnie, ponieważ już wiedziałem, że wartość zwracana była w porządku z uwagi na to, że przypisany ciąg znaków był wyświetlany poprawnie. – ryanthon

Odpowiedz

14

Miałem ten sam problem. Rozwiązaniem było dla mnie umożliwienie wyboru właściwości UITextView w scenorysie. Potem wszystko działało.

Nadzieję, że pomaga

+2

YeahShad, dziękuję! To działało z poprawką. Oznaczyłem to pole jako dostępne do wyboru w IB, ale w czasie wykonywania (w ViewDidLoad) zmieniłem właściwość Wybieralne pola na NIE. Dostaję więc dekoracje attributedText, ale pole pozostaje niewybierane podczas wykonywania. – jbbenni

+2

Jest to znany problem. Jeśli masz taką ochotę, zgłoś błąd na http://bugreport.apple.com i podaj numer błędu # 15854592. –

+0

To jedna z wielu rzeczy, które powinniśmy zapamiętać, ponieważ Apple zatrudnia niespełniających standardów programistów. Złóż raport o błędzie, jeśli masz jeszcze więcej czasu do stracenia, ponieważ nie zauważą tego w najmniejszym stopniu. – amergin

Powiązane problemy