webentwicklung-frage-antwort-db.com.de

UITextViews in einem UITableView-Linkerkennungsfehler in iOS 7

Ich habe benutzerdefinierte UITableViewCells, die eine UITextView enthalten. Ich habe die Linkerkennung in UITextView im Interface Builder aktiviert. Wenn ich die Tabellenansicht zum ersten Mal lade, scheint alles zu funktionieren, aber wenn ich in der Tabellenansicht nach oben und nach unten scrolle, wird die Linkerkennung durcheinander. Insbesondere werden Zellen, die nur aus normalem Text bestehen (die normalerweise anfänglich dargestellt werden) als Links angezeigt (der gesamte Text in der Textansicht ist blau eingefärbt und stellt einen aktiven Link dar), und die Links zeigen auf Objekte, die sich in einigen befinden andere Tabellenansichtzellen. Ein Link kann beispielsweise auf eine Website verweisen, die sich in einer anderen Tabellensichtzelle befand, oder eine E-Mail an eine Adresse starten, die sich in einer anderen Tabellensichtzelle befand.

Es scheint, als würden die Verknüpfungen irgendwie gespeichert, wenn die Tabellenansicht-Zellen wiederverwendet werden, obwohl der Textansichtstext aktualisiert wird.

Dies ist nur bei iOS 7 der Fall, nicht bei iOS 6. Dies geschieht im Simulator und auf meinem Gerät.

Hier ist der Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *sectionKey = [self.orderedSectionKeys objectAtIndex:indexPath.section];
    NSDictionary *infoDictionary = [[self.tableViewData objectForKey:sectionKey] objectAtIndex:indexPath.row];

    static NSString *cellIdentifier = @"InfoDefaultTableViewCell";
    InfoDefaultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {        
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"InfoTableViewCells" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }

    cell.bodyTextView.text = [infoDictionary objectForKey:@"description"];

    return cell;
}

Weiß jemand, was hier passiert und wie man es löst?


Ich habe versucht, diesen Code nach dem Festlegen des Textansichtstextes hinzuzufügen, um die Links zurückzusetzen:

cell.bodyTextView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.bodyTextView.dataDetectorTypes = UIDataDetectorTypeAddress | UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber;

aber das Verhalten, das ich sehe, hat sich nicht geändert.

46
Darren

Dies scheint ein Fehler in UITextViews von iOS 7.0 zu sein. Eine ähnliche Frage hat eine Problemumgehung, die scheint zu helfen: Setzen Sie den Text der Textansicht auf nil, bevor Sie ihn auf die neue Textzeichenfolge setzen.

38
cbowns

Mehrere Vorschläge hier und über Links haben mir bei diesem Fehler nicht weitergeholfen.

Ich habe versucht, den zugewiesenen Text einzustellen, den Text auf Null zu setzen und den Text auf "" zu setzen.

Am Ende erzwang die Erzwingung der Textansicht einen nicht bearbeitbaren Modus. In Vorbereitung auf die Wiederverwendung

- (void)prepareForReuse
{
  ...
    textView.editable = YES;
    textView.editable = NO;
  ...
}
19
SuperGuyAbe

Keine dieser Antworten funktionierte für mich (iOS8, Swift). Das einzige, was für mich funktionierte, war, zuerst den Text auf nil zu setzen und dann den neuen Text mit einem nicht sichtbaren Whitespace-Unicode-Zeichen voranzustellen (ich wählte \u200B ZERO WIDTH SPACE Zeichen, aber jedes Zeichen funktioniert):

textView.text = nil
textView.text = "​\u{200B}\(newText)"
16
melvinmt

Einen besseren Weg gefunden, um dieses Problem zu lösen. Dies erfordert jedes Mal einen zusätzlichen Schritt, wenn Sie Text festlegen. Dies behebt aber definitiv das Problem. 

_textView.selectable = NO; // set it to NO clears all possible data detection work so far.
_textView.selectable = YES; // set it to YES so that actual links are detected.

Grundsätzlich muss bei der Datenerkennung das Feld selectable auf YES gesetzt sein, damit es funktioniert. Wenn Sie NO einstellen, wird es vollständig entfernt.

Hinweis: Dies gilt nur für iOS 7. 

6
Legolas

Das Festlegen des Textes auf nil hat bei einem sehr ähnlichen Problem nicht funktioniert, aber Das Setzen von scrollEnabled auf NO, wie vorgeschlagen mit here , hat den Trick für mich bewirkt.

Edit: Außerdem gab es noch einen ganz besonderen Fall, der Probleme verursachte: Als eine Box mit einem Link begann und der neue Text auf leeren Text gesetzt wurde (@ "" - nicht Null!), "Brach" die Box irgendwie und von da an wurde jeder neue Text zu einem Link. Meine Lösung bestand darin, setText zu überschreiben, [Supertext] zuerst auf @ "x" und dann auf den tatsächlichen neuen Text zu setzen. Wenn Sie stattdessen Null festlegen, wurde das Problem auch nicht gelöst.

5
Tharagon

Da eine der oben genannten Lösungen für mich funktioniert hat, besteht eine Problemumgehung darin, Ihre UITextView zu erstellen, wenn Sie den Text für jede Zelle aktualisieren und nicht in der wiederverwendbaren Zelle wiederverwenden sollen.

Ihr Code in der UITableViewCellDataSource lautet:

- (void)updateDescriptionWithText:(NSString *)descriptionText
{
    UITextView *descriptionTV = [[UITextView alloc] initWithFrame:aFrame];
    [descriptionTV setScrollEnabled:NO]; 
    [descriptionTV setEditable:NO]; 
    [descriptionTV setDataDetectorTypes:UIDataDetectorTypeLink]; 
    if ([descriptionV respondsToSelector:@selector(setSelectable:)]) 
     [descriptionTV  setSelectable:YES];
    [descriptionTV setText:descriptionText];
    [self addSubview:descriptionTV];
}

Und in der UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   ***your init code***

   [cell updateDescriptionWithText:description];
}   
3
Jason LAPIERRE

Es scheint, dass das Einstellen des Textes auf nil vor dem Setzen des neuen Textes nicht funktioniert. Möglicherweise müssen Sie auch in der Lage sein, die Textansicht durchzublättern, sodass das Festlegen von scrollEnabled möglicherweise keine Option ist.

Es funktioniert jedoch beim Erstellen und Festlegen einer attributed-Zeichenfolge in der Textansicht der Zelle. Ich habe eine collection-Ansicht verwendet, sollte jedoch mit table-Ansichten identisch sein. Ich habe die folgenden Zeilen in den collectionView:cellForItemAtIndexPath: geschrieben

//get the color and other properties from your UITextView
UIColor *textColor = cell.textView.textColor;
UIFont *messageFont = cell.textView.font;

//create your attributed string
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:yourStringForTheTextView attributes:@{NSForegroundColorAttributeName:textColor, NSFontAttributeName:messageFont}];

//set it to your UITextView
cell.textView.attributedText = attributedString;

Hoffe das hilft :).

2
Cornel

Sie können dieses Problem beheben, indem Sie NSAttributedString verwenden.

cell.textview.attributedText = [[NSAttributedString alloc] initWithString:message.message];
2
Ardra Thambi

Keine der vorgeschlagenen Workarounds funktioniert für mich. Also habe ich beschlossen, eine neue UITextView zu erstellen und diese bei jeder erneuten Verwendung der Zelle durch die alte zu ersetzen. Es ist nicht ideal für die Performance, aber es funktioniert zumindest.

1
tbergmen

Dieser arbeitet zuverlässig für mich:

// fix url detection bug
cell.textView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.textView.dataDetectorTypes = UIDataDetectorTypeLink;
1
Andrew Bennett

Das Ändern der Farbtonfarbe in eine andere Farbe funktioniert tatsächlich ... Wenn jedoch aktiviert wird, hat der Farbton auch die gleiche Farbe.

0
Desmond

Ich stehe auch vor diesem Problem, und ich habe herausgefunden, dass es so ist, die Eigenschaften der Textansicht in der folgenden Reihenfolge festzulegen:

[textview setDataDetectorTypes:UIDataDetectorTypeNone ];
textView.editable = NO;
[textView setDataDetectorTypes:UIDataDetectorTypeLink];
[email protected]"The text you need to show with link";

Hoffe das hilft dir .....

0