【问题标题】:Swipe gesture for UITableviewUITableview 的滑动手势
【发布时间】:2023-04-09 05:28:01
【问题描述】:

我有一种感觉,答案是“你不能那样做”,但希望永存!

我的应用程序中的一个场景是 UITableView;该表代表一个月,每一行是一个月中的一天。我在表格顶部有一个小的 UIView,带有“上一个”和“下一个”按钮。在显示下个月的表格中选择下一个结果,上一个会显示上一个月。所有这些都很好。

我想做的是添加左右手势识别器以逐月移动,执行与 Prev 和 Next 按钮相同的功能。请注意,我不需要 UITableViewCell 发生任何事情。

当我在网上搜索这个时,绝大多数帖子似乎是如何处理 UITableViewCell 中的手势识别器。这对我没有帮助。

我正在使用 Objective-C 和 Xcode 11.3.1。

有什么想法吗?

提前致谢。

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    你应该可以做到的。通过禁用每个单元格的交互,您应该能够将“UIGestureRecognizer”传递给 tableView。

    这是一个简短的例子。抱歉,我使用了 Swift,但您可能可以了解它的要点。

    添加 tableView 后,我向其中添加了这些手势识别器。

    let leftGesture = UISwipeGestureRecognizer(target: self, action: #selector(leftSwiped))
        leftGesture.direction = .left
        tableView.addGestureRecognizer(leftGesture)
    
        let rightGesture = UISwipeGestureRecognizer(target: self, action: #selector(rightSwiped))
        rightGesture.direction = .right
        tableView.addGestureRecognizer(rightGesture)
    

    每一个调用以下函数:

    @objc func leftSwiped() {
        print("LEFT")
    }
    
    @objc func rightSwiped() {
        print("Right")
    }
    

    在单元格中,我刚刚禁用了单元格的用户交互:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        cell.isUserInteractionEnabled = false
        cell.backgroundColor = .random()
        return cell
    }
    

    当我尝试它时,在表格视图上左右滑动会在记录器中正确打印。

    希望这会有所帮助, 艾伦

    【讨论】:

    • 艾伦 - 谢谢,但这仍然不适合我。为了进行测试,我制作了一个简单的应用程序,并从情节提要中添加了手势识别器,在表格中有一个单元格,并且当我向左/向右滑动时不会触发的动作。同样简单的应用程序,带有 UIView 和手势识别器和滑动功能完美。我想让这个工作,但禁用用户交互将是我的应用程序中的一个问题。当我的应用程序显示当前月份时,今天之后几天的行已经禁用了用户交互。但我需要能够选择其他行才能切换到日视图。
    • 我需要探索更多;我发现手势识别器在我的应用程序中的不同 UITableView 上工作,但不是我问题中的那个。
    • 在我设置的示例中,我以编程方式添加了手势并且它正在工作。如果我所做的对您有所帮助,您至少可以给我一个支持吗?
    • Alan - 我确实给了你一个赞成票1 不幸的是,我对 SO 用户太新了,不能公开显示赞成票。谢谢!
    【解决方案2】:

    Objective C 中的答案

    与@Alan 相同的答案,但无需在cellForRowAt 方法中添加以下行

    cell.isUserInteractionEnabled = false
    cell.backgroundColor = .random()
    

    使用下面的方法在 TableView 中滑动手势

     - (void)viewDidLoad
     {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        UISwipeGestureRecognizer *leftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftHandler)];
        [self.tableView addGestureRecognizer: leftGestureRecognizer];
    
        UISwipeGestureRecognizer *rightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightHandler)];
        [self.tableView addGestureRecognizer: leftGestureRecognizer];
    
    }
    
    -(void) swipeLeftHandler
    {
        NSLog(@"SWIPE Left");
    // add same method which you call on next button’s click
    }
    
    
    -(void) swipeRightHandler{
        NSLog(@"SWIPE Right");
    // add same method which you call on previous button’s click
    
    }
    

    【讨论】:

      【解决方案3】:

      问题已解决。

      我发现如果我以编程方式将滑动识别器添加到我的 tableview 中,识别器会按预期工作。但是如果使用情节提要添加滑动识别器,它们根本不起作用。这是我发布问题时正在测试的内容。

      经过一番挖掘,我发现需要将情节提要识别器添加到我的 tableview 中的引用插座集合中。无论出于何种原因,当我最初添加它们时,这并没有发生。将识别器连接到我的 tableview 后,一切都按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多