【问题标题】:Highlight long pressed table view cell and unhighlight in iOS using objective-C使用objective-C在iOS中突出显示长按的表格视图单元格并取消突出显示
【发布时间】:2015-12-13 21:53:20
【问题描述】:

长按突出显示表格视图单元格。

我参考了链接

Long press on UITableView

长按工作正常,但表格视图单元格未突出显示。所以我在 handleLongPress 方法中添加了以下行

[self.myTableView selectRowAtIndexPath:indexPath animated:NO  scrollPosition:UITableViewScrollPositionNone];

长按单元格高亮后,还应满足以下条件,

  1. 触摸同一个长按的表格视图单元格应取消突出显示,这就像第二次触摸表格视图单元格。
  2. 触摸其他表格视图单元格应该像选择多个单元格一样突出显示。
  3. 第二次触摸其他表格视图单元格时,应取消突出显示。

长按应该类似于触摸表格视图单元格,但它不应该是实际的触摸功能。请指导我。

【问题讨论】:

    标签: ios objective-c uitableview uigesturerecognizer


    【解决方案1】:

    试试:

    - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    

    【讨论】:

    • 我已经编辑了我的帖子,如果我取消选择行,将不满足 2 个条件。
    【解决方案2】:

    请使用这种类型的逻辑。 当您开始长按时,显示行选择,而长按结束您必须取消选择行。

    -(IBAction)longPressBegan:(UILongPressGestureRecognizer *)recognizer
    {
        if (recognizer.state == UIGestureRecognizerStateBegan)
        {
            // Long press detected, Just highlight row 
        }
        else
        {
            if (recognizer.state == UIGestureRecognizerStateCancelled
                || recognizer.state == UIGestureRecognizerStateFailed
                || recognizer.state == UIGestureRecognizerStateEnded)
            {
                // Long press ended, deselect row
            }
        }
    }
    

    希望对你有所帮助...........

    【讨论】:

    • 如果你的方法触发了不止一次,那么你在添加手势时做对了,否则你就犯了一些错误。
    • 它会触发多次以指示手势的不同状态(开始、更改、结束等)。所以在处理程序方法中。
    • 它被触发了多次,并获得了 UIGestureRecogniserStateBegan、UIGestureRecogniserStateChanged 和 UIGestureRecogniserStateEnded 三种状态。一旦我长按,它会突出显示,稍后它会在触摸结束时取消突出显示。它不像多个单元格选择那样突出显示。
    【解决方案3】:

    所以我假设你的所有条件都只是在你已经长按一个单元格的情况下。 看起来您可以进行长按工作。所以现在

    1. 在你的类中声明一个 BOOL。 BOOL 高亮显示;
    2. 在你的长按事件中添加

      [self.myTableView selectRowAtIndexPath:indexPath animated:NO      scrollPosition:UITableViewScrollPositionNone];
      
      YourCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath];
      
      //I dont’t know your model for this tableview so I am using cell tag for it 
      
      //using 1 for selected
      
      //2 for unselected
      
      // 3 for long pressed one 
      
      cell.tag = 3;
      
      isHiglighted = YES;
      
    3. 在您的 didSelectRowAtIndexPath 中使用以下 sudo 代码

      - (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
      
      {
      
          if(isHiglighted)
          {
              YourCell *cell = [self.myTableView cellForRowAtIndexPath:indexPath];
              if(cell.tag==3)
              {
                  [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
                  cell.tag = 2;
                  isHiglighted = NO;
              }
              else if(cell.tag==1)
              {
                  [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
                  cell.tag = 2;
              }
              else 
              {
                  [self.myTableView selectRowAtIndexPath:indexPath animated:NO  scrollPosition:UITableViewScrollPositionNone];
                  cell.tag = 1;
               }
      
          }
          else
          {
              // do your stuff ofr single tap if user never long pressed
          }
      }
      

    【讨论】:

    • didSelectRowAtIndexPath 方法在单元格未高亮时不调用,仅在单元格高亮时调用。已经试过了。
    • didSelectRowAtIndexPath 总是被调用,除非您实现 willselectRowAtIndex 路径并且在该方法中您返回 nil 或无效的 indexpath 是否可以发布与此问题相关的代码,不确定您面临的问题
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多