简体   繁体   English

无法在 UITableview 中的单元格内单击 UIButton

[英]can't click UIButton inside a cell in UITableview

searched already some possible fixes but all did not solve mine.已经搜索了一些可能的修复方法,但都没有解决我的问题。

i keep clicking the cell in the uitableview rather than the buttons inside it.我一直点击 uitableview 中的单元格而不是其中的按钮。

here is my code:这是我的代码:

- (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; 
}

I also tried the UITapGestureRecognizer for the buttons and still not working.我还为按钮尝试了UITapGestureRecognizer ,但仍然无法正常工作。

Thanks.谢谢。

I'm just baffled by this issue....我只是被这个问题弄糊涂了......

I managed to fix this problem by doing this on one project:我通过在一个项目上执行此操作设法解决了这个问题:

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
}

but the same did not work for a different project.但同样不适用于不同的项目。 I have no idea why...我不知道为什么...

There is another potential cause of problems like this one, and that is UITableViewCells now have a contentView .像这样的问题还有另一个潜在原因,那就是UITableViewCells现在有一个contentView This can and will be placed in front of other views in your custom table view cells in order to pick up touches and detect cell selection.这可以并且将被放置在自定义表格视图单元格中的其他视图之前,以便拾取触摸并检测单元格选择。 In doing so, it may block touches to any views behind it.这样做时,它可能会阻止对其背后的任何视图的触摸。 I've especially noticed this annoyance when creating cells using nibs.在使用笔尖创建单元格时,我特别注意到了这种烦恼。

The accepted means for dealing with this is to ensure that all subviews are added not to the tableview cell itself, but to its contentView .处理这个问题的公认方法是确保所有子视图都不是添加到 tableview 单元格本身,而是添加到它的contentView This is a read-only property that adjusts its own frame under certain circumstances, for example when slid sideways to reveal the delete button, or during editing mode.这是一个只读属性,可在某些情况下调整自己的框架,例如在侧向滑动以显示删除按钮时,或在编辑模式期间。 You should therefore ensure that any items you do add to the contentView are intelligently sized and have the correct resizing behaviour.因此,您应该确保添加到contentView任何项目都经过智能调整大小并具有正确的调整大小行为。

Also be aware that by adding cells to the contentView , you may yourself block touches to it and thus prevent the cell from being selected.另请注意,通过将单元格添加到contentView ,您自己可能会阻止对其进行触摸,从而防止单元格被选中。 I personally try not to allow cell selection in tableviews containing cells with custom user-enabled controls.我个人尽量不允许在包含具有自定义用户启用控件的单元格的表格视图中选择单元格。 It only leads to confusion and awkward interfaces.它只会导致混乱和尴尬的界面。 In fact, I'm seriously considering replacing all UITableViews in my future projects with UICollectionViews , which are far more adaptable.事实上,我正在认真考虑将我未来项目中的所有UITableViews替换为UICollectionViews ,它们的适应性要强得多。

-Ash -灰

I was doing this:我是这样做的:

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
}()

And it appears invoking the addTarget method inside of the closure did not work.并且在闭包中调用addTarget方法似乎不起作用。

When I factored the addTarget method out and instead put it in the initializer, everything worked!当我将addTarget方法分解出来并将其放入初始化程序时,一切正常!

In my case I tried to added the UIButton direct to the cell by self.addSubview(myButton) , so I changed to self.contentView.addSubview(myButton) and it worked在我的情况下,我尝试通过self.addSubview(myButton)将 UIButton 直接添加到单元格,所以我更改为self.contentView.addSubview(myButton)并且它起作用了

It seems the contentView was in front of the myButton so the button won't receive the tap gesture.似乎contentViewmyButton前面,所以按钮不会收到点击手势。

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

The UITableViewCell is handling all the gestures by default. UITableViewCell 默认处理所有手势。 Set cell.selectionStyle = UITableViewCellSelectionStyleNone;设置cell.selectionStyle = UITableViewCellSelectionStyleNone; to make it disable the default behaviour.使其禁用默认行为。

For Swift 3 and Storyboard对于 Swift 3 和 Storyboard

For me, I had to enable multiple touch inside the content view, and enable user interaction on everything - the table view, table view cell, content view, and UIButton.对我来说,我必须在内容视图中启用多点触控,并在所有内容上启用用户交互 - 表格视图、表格视图单元格、内容视图和 UIButton。 I was using storyboard.我正在使用故事板。

I also set up my tableview cell as a subclass.我还将我的 tableview 单元格设置为子类。

Since I couldn't find an answer here when I was exploring the problem, I posted another question on stack overflow about this.由于我在探索问题时无法在这里找到答案,因此我在堆栈溢出上发布了另一个关于此问题的问题。 You can see my code and download a project with this working here: Can't click button inside UITableViewCell?你可以在这里查看我的代码并下载一个项目: Can't click button inside UITableViewCell?

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

I have the same issue, and somehow I figured out my mistake.我有同样的问题,不知何故我发现了我的错误。
After I changed the constraints with self(UITableViewCell) to constraints with contentView of self(UITableViewCell) ,my cell's button is clickable again.之后,我改变了constraintsself(UITableViewCell) ,以constraintscontentViewself(UITableViewCell) ,我的手机的按钮是点击一次。

Update swift 4.2快速更新 4.2

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

add it : cell.buttonCheckBox.isUserInteractionEnabled = false添加它: cell.buttonCheckBox.isUserInteractionEnabled = false

OR, uncheck User Interaction Enabled inspector或者,取消选中启用用户交互的检查器在此处输入图片说明

Now you can select the button as well as a cell.现在您可以选择按钮和单元格。 This works for me :)这对我有用:)

Create a custom UITableViewCell.创建自定义 UITableViewCell。 Refer this link .请参阅此链接

Say you have a UIButton by the name of displayButton, you can do something like this:假设您有一个名为 displayButton 的UIButton ,您可以执行以下操作:

Inside your - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , after you create your cell,在您的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ,在您创建单元格后,

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

And the create the method like so in your ViewController:并在您的 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];
}

If you have no alternative selector for the UIButton pressed inside some UITableViewCell you need turn off userInteractionEnabled for the button如果在某些UITableViewCell内按下的UIButton没有替代选择器,则需要关闭该按钮的userInteractionEnabled

cellButton.userInteractionEnabled = false

In this case any button touch will propagate to the cell touch.在这种情况下,任何按钮触摸都会传播到单元格触摸。

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仅在“Mvvmcross.iOS”上测试

Just to add to the discussion:只是添加到讨论中:

FOR SWIFT 5+对于 SWIFT 5+

Is important to set the variable as lazy var when invoking the addTarget method inside of the closure.在闭包内部调用addTarget方法时,将变量设置为lazy var变量很重要。 See:看:

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 
}() 

Now, about the contentView of the tableViewCells that appears above the cell stoping the click at the cell: I used the code above and also set the contentView to .ishidden = true and it worked!现在,关于出现在单元格上方的tableViewCellscontentView停止在单元格处单击:我使用上面的代码并将contentView设置为.ishidden = true并且它有效!

Probably there is something linked to the lifecycle of the methods.可能有一些与方法的生命周期相关联的东西。

Hope it helps too.希望它也有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM