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"];