UITextViews在UITableView链接检测错误在iOS 7

我有自定义的UITableViewCells包含一个UITextView。 我在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; 

但它并没有改变我所看到的行为。

这似乎是iOS 7.0的UITextView的一个错误。 类似的问题有一个解决方法,似乎有帮助:设置文本视图的文本nil然后将其设置为新的文本string。

这里和通过提供的链接几个build议并没有帮助我这个错误。

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

最后迫使在可编辑模式的文本视图做了伎俩。 准备重用

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

这些答案都没有为我工作(iOS8,Swift),唯一的工作是我首先将文本设置nil ,然后用一个不可见的空格unicode字符(我select了\u200B ,这是零宽度字符,但任何字符作品):

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

find更好的方法来解决这个问题。 每次设置文本时都需要额外的步骤。 但是,这绝对解决了这个问题。

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

设置文本nil对我来说并不适用于一个非常类似的问题,但将scrollEnabled设置为NO ,就像这里所build议的那样,对我来说就是一招。

编辑:此外,还有一个非常特殊的情况,这导致了问题:当一个盒子开始与一个链接和新的文字设置为空文本(@“” – 不为零!)盒子以某种方式“打破”,从那时起在任何新的文字成为一个链接。 我的解决scheme是重写setText将[超文本]设置为@“x”,然后到实际的新文本。 设置为零,而不是解决这个问题。

由于上述任何解决scheme为我工作,我发现一个解决方法是创build您的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]; } 

您可以通过使用NSAttributedString来解决此问题。

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

在设置新文本之前,似乎将文本设置nil是行不通的。 您也可能需要能够滚动文本视图,所以设置scrollEnabled可能不是一个选项。

但是,当您创build并设置属性string到单元格的文本视图时,它工作。 我使用了一个集合视图 ,但它应该与表视图相同。 我在collectionView:cellForItemAtIndexPath:写了以下几行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; 

希望这可以帮助 :)。

非build议的解决方法适用于我。 所以我决定创build一个新的UITextView,并用旧的replace它,每次单元格被重用。 性能不理想,但至less可以工作。

这个对我来说是可靠的:

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

将色调颜色更改为其他颜色实际上起作用。 但是,如果select启用色彩也将是相同的颜色。

我也面临这个问题,我发现解决这个问题是按以下顺序设置textview属性,

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

希望这个帮助你…..

 textView.text = nil; textView.attributedText = nil; textView.attributedText = [[NSAttributedString alloc] initWithString:@"your new string"];