web-dev-qa-db-ja.com

UITableviewのセル内のUIButtonをクリックできません

すでにいくつかの可能な修正を検索しましたが、すべてが私のものを解決しませんでした。

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を試しましたが、まだ機能しません。

ありがとう。

11
Long Neutrals

私はこの問題に困惑しています...

1つのプロジェクトでこれを行うことで、この問題を修正することができました。

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
}

しかし、同じことは別のプロジェクトでは機能しませんでした。理由がわからない...

26
Mateusz266

このような問題の別の潜在的な原因があります。つまり、UITableViewCellscontentViewがあります。これは、タッチを取得してセルの選択を検出するために、カスタムテーブルビューセル内の他のビューの前に配置できます。そうすることで、背後にあるビューへのタッチをブロックする可能性があります。ペン先を使用してセルを作成するときに、この煩わしさに特に気づきました。

これに対処するために受け入れられている手段は、すべてのサブビューがテーブルビューセル自体ではなく、そのcontentViewに追加されるようにすることです。これは読み取り専用のプロパティであり、特定の状況下で、たとえば、削除ボタンを表示するために横にスライドしたときや、編集モード中に、独自のフレームを調整します。したがって、contentViewに追加するアイテムはすべてインテリジェントなサイズであり、正しいサイズ変更動作を備えていることを確認する必要があります。

また、セルをcontentViewに追加すると、セルへのタッチがブロックされ、セルが選択されなくなる可能性があることにも注意してください。私は個人的に、カスタムのユーザー対応コントロールを備えたセルを含むテーブルビューでセルを選択できないようにしています。それは混乱と厄介なインターフェースにつながるだけです。実際、私は将来のプロジェクトですべてのUITableViewsをはるかに適応性の高いUICollectionViewsに置き換えることを真剣に検討しています。

-灰

22
Ash

UIButton =のyオフセットは160として指定され、UIView's高さはちょうど120として指定されます。UIButton'syオフセットを変更して試してください。

4
HRM

Swift 3およびStoryboardの場合

私の場合、コンテンツビュー内でマルチタッチを有効にし、テーブルビュー、テーブルビューセル、コンテンツビュー、UIButtonなどすべてでユーザー操作を有効にする必要がありました。絵コンテを使っていました。

また、テーブルビューセルをサブクラスとして設定しました。

問題を調査しているときにここで答えが見つからなかったので、これについてスタックオーバーフローに別の質問を投稿しました。あなたは私のコードを見て、これがここで機能しているプロジェクトをダウンロードすることができます: ITableViewCell内のボタンをクリックできませんか?

4
Nick

UITableViewCellは、デフォルトですべてのジェスチャを処理しています。セットする cell.selectionStyle = UITableViewCellSelectionStyleNone;デフォルトの動作を無効にします。

3
Rickye

この問題が発生しましたが、私の場合はテーブルビューとは関係ありませんでした。代わりに、ボタンでuserInteractionEnabledがtrueのサブビューを使用していて、その値をfalse(NO)に設定していたためです。すべてのボタンのサブビューで問題が修正されました。

2
ThomasW

私はこれをやっていた:

let plusButton: UIButton = {
        let v = UIButton()
        v.setImage(plusImg, for: .normal)
        v.tintColor = .dark
        v.translatesAutoresizingMaskIntoConstraints = false
        v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside)
        // adding targets here did not work
        return v
    }()

また、クロージャー内でaddTargetメソッドを呼び出しても機能しなかったようです。 addTargetメソッドを因数分解し、代わりに初期化子に入れると、すべてが機能しました。

2
Lord Fresh

これを試して

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);


    }

「Mvvmcross.iOS」でのみテスト済み

0
Komicon

UIButton内で押されたUITableViewCellの代替セレクターがない場合は、ボタンのuserInteractionEnabledをオフにする必要があります

cellButton.userInteractionEnabled = false

この場合、ボタンのタッチはセルのタッチに伝播します。

0
malex

私も同じ問題を抱えていますが、どういうわけか自分の間違いを見つけました。
self(UITableViewCell)constraintsself(UITableViewCell)constraintscontentViewに変更した後、私のセルのボタンはもう一度クリック可能。

0
wj2061

カスタムUITableViewCellを作成します。 このリンク を参照してください。

DisplayButtonという名前のUIButtonがあるとすると、次のようなことができます。

- (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];
}
0
Anil

更新Swift 4.2

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

追加:cell.buttonCheckBox.isUserInteractionEnabled = false

または、ユーザーインタラクション対応インスペクターのチェックを外します enter image description here

これで、ボタンとセルを選択できます。これは私のために働きます:)

0
Ali