1

我正在开发一个应用程序,该应用程序在表格视图的自定义 UITableViewCell 中有一个 UITextView。tableviewcell 有几个手势识别器。我的问题是 textview 在 tableViewCell 的识别器之前响应触摸。我有一个长按将单元格移动到另一个位置,但文本视图将尝试选择它的文本以进行复制/粘贴/放大镜功能。此外,textview 正在吞噬来自 tableview 本身的触摸,因此如果您开始滚动触摸 textview,则滚动将不会在 tableview 内起作用。

即使将可编辑属性设置为 false,textview 仍然希望选择文本并显示放大镜。

最初,我使用 UITextField 而不是 UITextView 来完成所有工作,但我需要支持多行文本。

那么如何防止 textview 吞下任何触摸事件呢?任何建议或想法将不胜感激。

4

1 回答 1

1

以下是我们如何处理UITextView包含在 a 中的用户交互UITableViewCell

1) 你UIViewController应该符合UITableViewDataSource,UITableViewDelegateUITextViewDelegate:

#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    
}

这主要是当场写的,所以可能会有一些小错误,但希望你能得到大致的想法。

祝你好运。

于 2013-09-07T05:54:23.990 回答