46

我有包含 UITextView 的自定义 UITableViewCells。我在 Interface Builder 中打开了 UITextView 中的链接检测。当我第一次加载表格视图时,一切似乎都在工作,但是当我上下滚动表格视图时,链接检测变得一团糟。具体来说,只有常规文本(最初正常显示)的单元格显示为链接(文本视图中的所有文本都显示为蓝色,并且是活动链接),并且链接指向某些其他表格视图单元格。例如,链接可能指向位于不同表格视图单元格中的网站,或者向位于不同表格视图单元格中的地址发送电子邮件。

似乎当表格视图单元被重用时,即使文本视图文本正在更新,链接也会以某种方式被保存。

这只发生在 iOS 7 中,而不是 iOS 6。它发生在模拟器和我的设备上。

这是代码:

- (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 回答
19

这里和通过提供的链接的一些建议并没有帮助我解决这个错误。

我尝试设置属性文本,将文本设置为零,将文本设置为@""。

最后,强制文本视图处于不可编辑模式就可以了。准备重用

- (void)prepareForReuse
{
  ...
    textView.editable = YES;
    textView.editable = NO;
  ...
}
于 2014-04-16T20:50:53.120 回答
16

这些答案都没有对我有用(iOS8,Swift),唯一对我有用的是首先将文本设置为nil,然后在新文本前面加上一个不可见的空白 unicode 字符(我选择了\u200B,这是零宽度空格字符,但任何字符都有效):

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对我不起作用,但将 scrollEnabled 设置为NO,就像这里建议的那样,对我有用。

编辑:此外还有一个非常特殊的情况,这会导致问题:当一个框以链接开头并且新文本设置为空文本(@“” - 不是零!)时,该框不知何故“坏了”,从那时起在任何新文本上都变成了一个链接。我的解决方案是覆盖 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 回答
2

似乎nil在设置新文本之前将文本设置为不起作用。您可能还需要能够滚动文本视图,因此设置scrollEnabled可能不是一个选项。

但是,当您创建属性字符串并将其设置为单元格的文本视图时,它会起作用。我使用了一个集合视图,但它应该与表视图相同。我在collectionView:cellForItemAtIndexPath:

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

希望这可以帮助 :)。

于 2014-06-19T12:48:34.900 回答
1

建议的解决方法都不适合我。所以我决定创建一个新的 UITextView 并用旧的替换它,每次重用单元格时。它对于性能来说并不理想,但至少它可以工作。

于 2014-01-02T09:52:55.553 回答
1

这个对我来说很可靠:

// fix url detection bug
cell.textView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.textView.dataDetectorTypes = UIDataDetectorTypeLink;
于 2015-01-05T20:37:09.137 回答
0

将 Tint 颜色更改为其他颜色实际上有效。但是,如果可选择启用,则色调也将是相同的颜色。

于 2013-10-29T08:48:04.123 回答
0

我也遇到了这个问题,我发现解决这个问题的方法是按以下顺序设置 textview 属性,

[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 回答