我正在开发一个在桌面视图中的自定义UITableViewCell中具有UITextView的应用程序。 tableviewcell有几个手势识别器。我的问题是textview在tableViewCell的识别器之前响应触摸。我有一个很长的时间用于将单元格移动到另一个位置,但是textview会尝试选择它的文本来复制/粘贴/放大镜功能。此外,textview正在吞噬tableview本身的触摸,因此如果你开始滚动文本视图滚动,滚动将无法在tableview中运行。
即使将editable属性设置为false,textview仍然希望选择文本并显示放大镜。
最初,我使用UITextField代替UITextView,但我需要支持多行文本。
那么如何防止textview吞噬任何触摸事件?任何建议或想法将不胜感激。
答案 0 :(得分:1)
以下是我们如何处理UITextView
中包含的UITableViewCell
用户互动:
1)您的UIViewController
应符合UITableViewDataSource
,UITableViewDelegate
和UITextViewDelegate
:
#import <UIKit/UIKit.h>
@interace MyExampleController : UIViewController <UITableViewDataSource, UITableViewDelegate, UITextViewDelegate>
2)最初,文本视图的userInteractionEnabled
属性设置为NO
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *textViewCellIdentifier = @"MyTextViewCellIdentifier";
MyTextViewViewCell *cell = [tableView dequeueReusableCellWithIdentifier:textViewCellIdentifier];
if (!cell)
{
// ... do your stuff to create the cell...
cell.textView.userInteractionEnabled = NO;
cell.textView.delegate = self;
}
// do whatever else to set the cell text, etc you need...
return cell;
}
3)检查是否通过UITableViewDelegate
方法点击了文本视图单元格:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
BOOL isTextViewCell = ... // do your check here to determine if this cell has a text view
if (isTextViewCell)
{
[[(MyTextTableViewCell *)cell textView] setUserInteractionEnabled:YES];
[[(MyTextTableViewCell *)cell textView] becomeFirstResponder];
}
else
{
// ... do whatever else you do...
}
}
4)检查\n
以确定何时让textView辞职第一响应者(当用户按下return
键时通过):
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text rangeOfString:@"\n"].location != NSNotFound)
{
[textView resignFirstResponder];
textView.
return NO;
}
return YES;
}
5)在文本视图重新签名(结束编辑)后,将文本保存到模型中一次:
- (void)textViewDidEndEditing:(UITextView *)textView
{
NSString *text = textView.text;
// do your saving here
}
这主要是当场写的,所以可能会有一些小错误,但希望你能得到一般的想法。
祝你好运。