46

UITextView を含むカスタム UITableViewCells があります。Interface Builder で UITextView のリンク検出をオンにしました。テーブル ビューを最初にロードしたときは、すべてが機能しているように見えますが、テーブル ビューを上下にスクロールすると、リンク検出がめちゃくちゃになります。具体的には、通常のテキストのみを含むセル (最初は通常どおり表示されます) がリンクとして表示され (テキスト ビュー内のすべてのテキストは青色で、アクティブなリンクです)、リンクはいくつかのオブジェクトにあるオブジェクトを指しています。他のテーブル ビュー セル。たとえば、リンクが別のテーブル ビュー セルにあった Web サイトを指している場合や、別のテーブル ビュー セルにあったアドレスに電子メールを起動する場合があります。

テキストビューのテキストが更新されているにもかかわらず、テーブルビューのセルが再利用されているように見えますが、リンクは何らかの形で保存されています。

これは、iOS 6 ではなく iOS 7 でのみ発生します。シミュレーターと私のデバイスで発生します。

コードは次のとおりです。

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

ここで何が起こっているのか、そしてそれを解決する方法を知っている人はいますか?


リンクをリセットするために、テキストビューのテキストを設定した後にこのコードを追加しようとしました:

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

しかし、私が見ている動作は変わりませんでした。

4

13 に答える 13

37

これは iOS 7.0 のバグUITextViewのようです。同様の質問には、役立つと思われる回避策がありnilます。新しいテキスト文字列に設定する前に、テキストビューのテキストをに設定してください。

于 2013-10-02T00:13:54.437 に答える
16

これらの答えはどれも私にとってはうまくいきませんでした(iOS8、Swift)、私にとってうまくいった唯一のことは、最初にテキストを設定してからnil、新しいテキストの前に目に見えない空白のユニコード文字を追加することでした(ゼロ幅\u200BであるSPACE文字ですが、どの文字でも機能します):

textView.text = nil
textView.text = "​\u{200B}\(newText)"
于 2014-09-23T12:11:36.920 に答える
6

この問題を解決するより良い方法を見つけました。これには、テキストを設定するたびに追加の手順が必要です。しかし、これは間違いなく問題を解決します。

_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.

基本的に、データ検出を機能させるには、selectableフィールドを YES に設定する必要があります。NO に設定すると、完全に削除されます。

注: これは ios7 のみです。

于 2014-09-05T16:34:50.180 に答える
5

nil非常によく似た問題でテキストを に設定してもうまくいきませんでしたが、ここNOで提案されているように scrollEnabled を に設定するとうまくいきました。

編集:さらに、問題を引き起こす非常に特殊なケースがまだありました:ボックスがリンクで始まり、新しいテキストが空のテキスト(@ ""-nilではありません!)に設定された場合、ボックスは何らかの形で「壊れ」、それ以降新しいテキストでリンクになりました。私の解決策は、 setText をオーバーライドして [super text] を最初に @"x" に設定し、次に実際の新しいテキストに設定することでした。代わりに nil に設定しても、この問題は解決しませんでした。

于 2013-10-25T12:17:27.340 に答える
3

上記の解決策のいずれかがうまくいったので、私が見つけた回避策はUITextView、再利用可能なセルで再利用するのではなく、各セルのテキストを更新する必要があるときに作成することです。

のコードは次のUITableViewCellDataSourceようになります。

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

そしてでUITableViewCell

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

   [cell updateDescriptionWithText:description];
}   
于 2014-02-27T13:22:43.953 に答える
2

この問題は、NSAttributedString を使用して修正できます。

cell.textview.attributedText = [[NSAttributedString alloc] initWithString:message.message];
于 2014-06-16T06:08:41.570 に答える
0

私もこの問題に直面しており、これを解決するには、テキストビューのプロパティを次の順序で設定することであることがわかりました。

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

これがお役に立てば幸いです.....

于 2015-09-25T09:22:43.887 に答える
-1
textView.text = nil;
textView.attributedText = nil;

textView.attributedText = [[NSAttributedString alloc] initWithString:@"your new string"];
于 2015-12-12T14:09:35.727 に答える