21

已经搜索了一些可能的修复,但都没有解决我的问题。

我一直单击 uitableview 中的单元格,而不是其中的按钮。

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:  (NSIndexPath *)indexPath{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.backgroundColor = [UIColor blackColor];

    UIView *v  = nil;
    NSArray *array = [cell subviews];

    for (v in array) {
        NSLog(@"%@",[v class]);
        if( [v isKindOfClass:[UIView class]] ){
           [v removeFromSuperview];
        }
    }

    //tb
    if (tableView == self.tb) {

        v = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.tb.bounds.size.width, 120.0)];

        if([feeds count]>0){
            UIImageView *box=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"statusBox.png"]];

            box.userInteractionEnabled = YES;
            [v addSubview:box];

            AsyncImageView *imageView1 = [[AsyncImageView alloc] initWithFrame:CGRectMake(10, 20.0f, 34.0f, 34.0f)];
            imageView1.contentMode = UIViewContentModeScaleAspectFill;
            imageView1.clipsToBounds = YES;

            //cancel loading previous image for cell
            [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView1];
            if (users1 != nil && users1.imagelink != nil && (id) users1.imagelink !=   [NSNull null]){
               imageView1.imageURL = [NSURL URLWithString:users1.imagelink];
            }
            else{
                imageView1.image=[UIImage imageNamed:@"default_ProfilePic.png"];
            }

            UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)];
            tapped.numberOfTapsRequired = 1;
            [imageView1 addGestureRecognizer:tapped];
            [tapped release];

            imageView1.userInteractionEnabled = NO;
            [v addSubview:imageView1];


            UIFont *font     = [UIFont fontWithName:@"TrebuchetMS-Bold" size:11];
            UILabel *descLabel1 = [[UILabel alloc] initWithFrame: CGRectMake(52, 23, 160, 48)];
            descLabel1.text                 = [NSString stringWithFormat:@"%@ %@",users1.userfirstn,users1.userlastn];
            descLabel1.textColor            = [UIColor blackColor];
            descLabel1.font                 = font;
            descLabel1.adjustsFontSizeToFitWidth=YES;
            descLabel1.numberOfLines = 0;
            CGSize expectedLabelSize = [descLabel1.text sizeWithFont:descLabel1.font
                                               constrainedToSize:descLabel1.frame.size
                                                   lineBreakMode:UILineBreakModeWordWrap];

            CGRect newFrame = descLabel1.frame;
            newFrame.size.height = expectedLabelSize.height;
            descLabel1.frame = newFrame;
            descLabel1.numberOfLines = 0;

            descLabel1.userInteractionEnabled = NO;
            [v addSubview:descLabel1];


            UILabel *descLabel2= [[UILabel alloc] initWithFrame: CGRectMake(52, 43, 200, 48)];
            StatusClass *stat1=[feeds objectAtIndex:indexPath.row];
            descLabel2.text                 = [stat1 statcreate];
            descLabel2.textColor            = [UIColor blackColor];
            descLabel2.font                 = font;
            descLabel2.adjustsFontSizeToFitWidth=YES;
            descLabel2.numberOfLines = 0;
            CGSize expectedLabelSize2 = [descLabel2.text sizeWithFont:descLabel2.font
                                                constrainedToSize:descLabel2.frame.size
                                                    lineBreakMode:UILineBreakModeWordWrap];

            CGRect newFrame2 = descLabel2.frame;
            newFrame2.size.height = expectedLabelSize2.height;
            descLabel2.frame = newFrame2;
            descLabel2.numberOfLines = 0;

            descLabel2.userInteractionEnabled = NO;
            [v addSubview:descLabel2];

            UILabel *descLabel3= [[UILabel alloc] initWithFrame: CGRectMake(10, 63, 280, 80)];
            StatusClass *stat=[feeds objectAtIndex:indexPath.row];
            descLabel3.text                 = [stat stattext];
            descLabel3.textColor            = [UIColor blackColor];
            descLabel3.font                 = font;
            descLabel3.adjustsFontSizeToFitWidth=YES;
            descLabel3.numberOfLines = 0;

            descLabel3.userInteractionEnabled = NO;
            [v addSubview:descLabel3];

            //comment button
            UIButton *buttonC = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [buttonC addTarget:self action:@selector(sendComment:) forControlEvents:UIControlEventTouchUpInside];
            [buttonC setImage:[UIImage imageNamed:@"comment.png"] forState:UIControlStateNormal];
            buttonC.frame = CGRectMake(2, 160, 145, 35);

            buttonC.userInteractionEnabled = YES;
            [v addSubview:buttonC];

            //share button
            UIButton *buttonS = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            buttonS.tag = indexPath.row;
            [buttonS addTarget:self action:@selector(sendShare:) forControlEvents:UIControlEventTouchUpInside];
            [buttonS setImage:[UIImage imageNamed:@"share.png"] forState:UIControlStateNormal];
            buttonS.frame = CGRectMake(150, 160, 140, 35);

            buttonS.userInteractionEnabled = YES;
            [v addSubview:buttonS];

        }
        v.userInteractionEnabled = YES;
        [cell addSubview:v];
    }
    return cell; 
}

我也尝试了UITapGestureRecognizer按钮,但仍然无法正常工作。

谢谢。

4

14 回答 14

52

我只是对这个问题感到困惑......

我设法通过在一个项目上这样做来解决这个问题:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("RegCell", forIndexPath: indexPath) as! CustomCell

    cell.contentView.userInteractionEnabled = false // <<-- the solution

    return cell
}

但同样不适用于不同的项目。我不知道为什么...

于 2016-01-30T17:52:04.963 回答
36

像这样的问题还有另一个潜在的原因,那就是UITableViewCells现在有一个contentView. 这可以并且将被放置在您的自定义表格视图单元格中的其他视图之前,以便拾取触摸并检测单元格选择。在这样做时,它可能会阻止对其背后的任何视图的触摸。在使用笔尖创建单元格时,我特别注意到了这种烦恼。

处理此问题的公认方法是确保所有子视图都不是添加到 tableview 单元格本身,而是添加到它的contentView. 这是一个只读属性,可在某些情况下调整其自身的框架,例如在侧向滑动以显示删除按钮时,或在编辑模式期间。因此,您应该确保您添加到的任何项目contentView都经过智能调整大小并具有正确的调整大小行为。

另请注意,通过将单元格添加到contentView,您自己可能会阻止对其进行触摸,从而阻止单元格被选中。我个人尽量不允许在包含具有自定义用户启用控件的单元格的表格视图中选择单元格。它只会导致混乱和尴尬的界面。事实上,我正在认真考虑将UITableViews我未来项目中的所有UICollectionViews内容都替换为更具适应性的 .

-灰

于 2013-12-30T20:39:19.660 回答
14

我正在这样做:

let plusButton: UIButton = {
    let v = UIButton()
    v.setImage(plusImg, for: .normal)
    v.tintColor = .dark
    v.translatesAutoresizingMaskIntoConstraints = false


    // adding targets here did not work
    v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside)


    return v
}()

似乎调用addTarget闭包内的方法不起作用。

当我将addTarget方法分解出来并将其放入初始化程序时,一切正常!

于 2017-12-27T23:31:02.070 回答
12

在我的情况下,我尝试将 UIButton 直接添加到单元格中self.addSubview(myButton),所以我改为self.contentView.addSubview(myButton)并且它有效

似乎contentView在前面,myButton所以按钮不会收到点击手势。

于 2020-08-31T10:36:54.050 回答
5

您的UIButton='sy 偏移量为 160,UIView's高度仅为 120。请更改UIButton'sy 偏移量并尝试。

于 2013-09-18T08:56:45.603 回答
4

UITableViewCell 默认处理所有手势。设置cell.selectionStyle = UITableViewCellSelectionStyleNone;为禁用默认行为。

于 2013-09-18T07:47:07.907 回答
4

对于 Swift 3 和 Storyboard

对我来说,我必须在内容视图中启用多点触控,并在所有内容上启用用户交互 - 表格视图、表格视图单元格、内容视图和 UIButton。我正在使用故事板。

我还将我的 tableview 单元格设置为子类。

由于在探索问题时在这里找不到答案,因此我在堆栈溢出上发布了另一个关于此的问题。你可以在这里看到我的代码并下载一个项目:Can't click button inside UITableViewCell?

于 2017-04-05T16:14:38.340 回答
2

我遇到了这个问题,但在我的情况下,它与表格视图无关,而是因为我在我的按钮中使用了userInteractionEnabled为 true 的子视图,将所有按钮的子视图的值设置为 false (NO) 修复了对我来说问题。

于 2016-04-14T09:41:22.717 回答
1

快速更新 4.2

在 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

添加它:cell.buttonCheckBox.isUserInteractionEnabled = false

或者,取消选中启用用户交互的检查器 在此处输入图像描述

现在您可以选择按钮以及单元格。这对我有用:)

于 2020-02-13T10:37:16.740 回答
1

我有同样的问题,不知何故我发现了我的错误。
在我将constraintswith更改self(UITableViewCell)constraintswith contentViewof 之后self(UITableViewCell),我的单元格的按钮可以再次点击。

于 2017-10-18T09:43:01.570 回答
0

创建一个自定义 UITableViewCell。请参阅此链接

假设您有一个UIButton名为 displayButton,您可以执行以下操作:

在你的内部- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath,在你创建你的单元格之后,

[cell.dislayButton addTarget: self
                             action: @selector(replyButtonPressed:withEvent:)
                   forControlEvents: UIControlEventTouchUpInside];

并在您的 ViewController 中创建这样的方法:

- (void) replyButtonPressed: (id) sender withEvent: (UIEvent *) event
{
    UITouch * touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView: self.tableView];
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location];
}
于 2013-09-18T07:49:43.123 回答
0

try this

public override void SetSelected(bool selected, bool animated)
    {
       // this.interestsButton.Selected = true;
        if (selected)
        {
            //  this.TextLabel.TextColor = UIColor.Red;

            //this.interestsButton.ShowsTouchWhenHighlighted = true;
            this.interestsButton.BackgroundColor = UIColor.Purple;
            //this.interestsButton.SetTitleColor(UIColor.Red, UIControlState.Highlighted);
        }
        else
        {

        }


       // cell.ContentView.UserInteractionEnabled = false;
        base.SetSelected(selected, animated);


    }

Tested on "Mvvmcross.iOS" only

于 2018-09-11T13:29:20.623 回答
0

只是添加到讨论中:

斯威夫特 5+

lazy var在调用addTarget闭包内的方法时设置变量很重要。看:

lazy var plusButton: UIButton = {
    let v = UIButton()
    v.setImage(plusImg, for: .normal)
    v.tintColor = .dark
    v.translatesAutoresizingMaskIntoConstraints = false
    v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside)
    return v 
}() 

现在,关于contentView出现tableViewCells在单元格上方的 停止单击单元格:我使用了上面的代码并将其设置contentView.ishidden = true并且它起作用了!

可能与方法的生命周期有关。

希望它也有帮助。

于 2022-02-15T19:23:44.793 回答
-1

如果您没有其他选择器用于UIButton按下内部某些按钮,则UITableViewCell需要关闭userInteractionEnabled按钮

cellButton.userInteractionEnabled = false

在这种情况下,任何按钮触摸都会传播到单元格触摸。

于 2018-07-31T23:10:02.340 回答