我在构建时收到一个有趣的警告(iPhone模拟器),它提供了以下内容:
EditView.xib:35:0 UITextView does not support data detectors when the text view is editable.
这在Google上基本上不存在,我想将其删除。
我的editview.xib有一个textview,我在其中写下笔记。还有更多需要的信息吗?
答案 0 :(得分:9)
我有四个不同的Xib,它们也有类似的TextView用于笔记。我得到了同样的警告。禁用“检测电话号码”和“检测链接”的建议会删除警告。但是,我希望我的用户仍然能够在笔记中使用探测器。
这就是我在我的应用中解决问题的方法:
在IB中:我取消选择了TextView的两个属性。 - (这会停止构建警告)。
在我的- (void)viewDidLoad {
中,我将textView的属性设置为以下内容:
myTextView.dataDetectorTypes = UIDataDetectorTypeAll;
启用所有类型的数据检测器(电话号码和URL地址)。
在我的View Controller中:-(void)textViewDidBeginEditing:(UITextView *)sender {
方法,我使用:myTextView.dataDetectorTypes = UIDataDetectorTypeNone
然后利用-(void)textViewDidEndEditing:(UITextView *)sender {
方法,我使用:myTextView.dataDetectorTypes = UIDataDetectorTypeAll;
当用户编辑UITextView时,此方法禁用数据检测器,并在用户完成编辑时将数据检测器重新打开。这个修复允许从textView中选择电话号码和URL,这样我就没有松开这个功能。
我在UITextView的DataDetector上的Apple Docs中找到了以下内容:在玩了UITextView一段时间后,希望它有所帮助。
定义可在基于文本的内容中检测到的信息类型。
<小时/> 更新:11-5-2010;
额外注意: 如果UITextView是“可编辑的”,则不允许使用数据检测器,因为存在太多变量来跟踪用户对文本的更改以及尝试执行电话或链接时的触摸。
<强>解决方案:强>
使用self.textView.editable = NO;
加载TextView,并根据我上面列出的类型设置UIDataDetector。这样,如果用户想要“选择”网址或电话号码等,代表就可以处理。当您需要用户编辑textView时,请打开self.textView.editing = YES;
&amp;相应地删除您的UIDataDetectors。这应该确保在编译期间没有错误或警告。
特别考虑: 确保在重新启用时首先删除datadectors,然后启用“editing = YES;”...如果仍然分配了UIdatadetectors,则启用编辑的顺序非常重要。
因此,序列顺序应该是这样的......
编辑textView: 1.删除数据检测器,然后启用编辑= YES。
使用DataDetectors: 1.禁用Editing = NO; 2.然后添加数据检测器。
答案 1 :(得分:7)
我也看到了这个警告。以下是我修复它的方法:
在Interface Builder的xib文件中,选择文本视图,然后调出属性检查器。确保“检测电话号码”和“检测链接”都是未检查的。
我检查了“检测链接”,结果发现导致警告的原因。基本上,如果textview是可编辑的,则不希望打开这些自动检测功能。
答案 2 :(得分:6)
太可靠了!
textView.editable = NO;
textView.dataDetectorTypes = UIDataDetectorTypeAll;
网址必须以“http://”开头,否则textview无法检测到它。
答案 3 :(得分:2)
我想过尝试使用带有“delaysTouchesBegan = YES”和“cancelsTouchesInView = NO”的Tap-Gesture-Recognizer
它仍然很容易解决!
加载具有可编辑已禁用状态的视图以及UIDataDetectorTypeAll
或您要检测的链接类型。然后添加一个GestureRecognizer:
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(editTextRecognizerTabbed:)];
recognizer.delegate = self;
recognizer.numberOfTapsRequired = 1;
[self.textViewNotes addGestureRecognizer:recognizer];
因此您可以在此方法中更改设置:
- (void) editTextRecognizerTabbed:(UITapGestureRecognizer *) aRecognizer;
{
self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeNone;
self.textViewNotes.editable = YES;
[self.textViewNotes becomeFirstResponder];
}
至少你必须在用户完成文本输入后更改编辑和检测设置:
- (void)textViewDidEndEditing:(UITextView *)textView;
{
self.textViewNotes.editable = YES;
self.textViewNotes.dataDetectorTypes = UIDataDetectorTypeAll;
}
为lika带来魅力!
答案 4 :(得分:0)
UITextView的数据检测器用于复制和粘贴。由于您将其设置为可编辑,因此不应允许在您认为粘贴的位置进行复制/粘贴,但不应复制。
答案 5 :(得分:0)
Simplenote以某种方式在iOS 4上执行此操作。(如果您想尝试,可以使用免费的/ lite版本。)
它有点不同: 当点击其中一个突出显示的部分时,它仍然开始编辑,并且不会跟随链接。
但是当您点击并按住检测到的dataTpye时,它会显示调用菜单,打开链接或其他任何内容。
此外,当点击文本内部时,编辑确实从您点击的位置开始。 因此,他们以某种方式删除dataDectectors,启用编辑并在识别到水龙头后将触摸转发到可编辑的UITextview。
任何想法如何做到这一点?
我想过尝试使用带有“delaysTouchesBegan = YES”和“cancelsTouchesInView = NO”的Tap-Gesture-Recognizer
所以我可以删除dataConnectorTypes并在识别器的action方法上设置它是可编辑的, 并且希望UITextview的触摸在此之后发布。
但到目前为止还没有时间对它进行测试。