0

カスタム tableCells を使用して標準の UITableView を構築しています。カスタマイズされたセルが touchBegan と touchEnd で何かをしたいと思います。これらのタッチ メソッドをカスタム セル クラスに実装したところ、問題なく動作しました。

ここから楽しみが始まります。カスタム セルがあるテーブルがタッチを受けていない理由を理解するのにしばらく時間がかかりました。セルがタッチで何かを行うようにしたかっただけでなく、テーブルがそのタッチを受け取るようにして、didSelectRow/didDeselectRowAtIndexPath を呼び出せるようにしました。次に、[super touchesBegan:touches withEvent:event] をカスタム セル クラスのすべてのタッチ メソッドに追加しました。これにより、セル タッチも受け取るテーブルが得られました。プログラムを実行すると、最初の 2 ~ 3 回のタッチがセルとテーブルの両方に登録されます。その後、セルは毎回タッチを登録し続けますが、テーブルは1回おきにタッチを登録するだけですこの奇妙な振る舞いは私を困惑させました。ビュー階層の概念を調べて、それが問題になる可能性があるかどうかを確認し、hitTest などの代替手段を検討しましたが、これに対する明白な解決策として際立ったものはありません。なぜこれが起こるのかについて誰かが理論を持っていますか? カスタム セル タッチと didSelectRowAtIndexPath メソッドのコードを次に示します。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches]anyObject];

    if([touch view] == self.nameLabel) {
        CGFloat isRed = 151.0/255.0;
        CGFloat isGreen = 151.0/255.0;
        CGFloat isBlue = 151.0/255.0;

            self.nameLabel.backgroundColor = [[UIColor alloc]initWithRed:isRed green:isGreen blue:isBlue alpha:1.0];

    if(!self.currentlySelected) {

        NSLog(@"if(!self.currentlySelected");

        self.currentlySelected = YES;
        [self.accessoryButton setImage:[UIImage imageNamed:@"Checkmark.png"]forState:UIControlStateNormal];
        self.accessoryButton.hidden = NO;

    }
    else {
        NSLog(@"if(self.currentlySelected");
        self.currentlySelected = NO;
       self.accessoryButton.hidden = YES;
        [self.accessoryButton setImage:nil forState:UIControlStateNormal];


    }

}
NSLog(@"Touch Began");
[super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
}


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches]anyObject];

    if([touch view] == self.nameLabel) {
        self.nameLabel.backgroundColor = [[UIColor alloc]initWithRed:self.isRed green:self.isGreen blue:self.isBlue alpha:1.0];
    }
    NSLog(@"Touch End");
    [super touchesEnded: touches withEvent: event];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
}

didSelectRowAtIndexPath:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"Method didselectRow was Called");

//If it is in the Alley section
if(indexPath.section == 0) {

    //If the selected cell is the same as the last selected cell
    if([self.lastIndexPathForAlleyCells isEqual:indexPath]) {
        NSLog(@"Same");
        [self.tableView beginUpdates];

        AlleyTableViewCell *previousCell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:self.lastIndexPathForAlleyCells];
        previousCell.currentlySelected = NO;
        self.lastIndexPathForAlleyCells = nil;
        previousCell.accessoryButton.hidden = YES;
        [self.tableView endUpdates];
    }

    //Else the selected cell is not the last selected cell
    else {
    [self.tableView beginUpdates];

        NSLog(@"Not the same");
        AlleyTableViewCell *previousCell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:self.lastIndexPathForAlleyCells];
        previousCell.currentlySelected = NO;
        previousCell.accessoryButton.hidden = YES;
    AlleyTableViewCell *cell = (AlleyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
        cell.currentlySelected = YES;
        cell.accessoryButton.hidden = NO;


    self.lastIndexPathForAlleyCells = indexPath;
    [self.tableView endUpdates];
    }
}

else if(indexPath.section == 1) {
    NSLog(@"Section 1 shouldn't be here");
    PlayerTableViewCell *cell = (PlayerTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    [cell.accessoryButton setImage:[UIImage imageNamed:@"Checkmark.png"] forState:UIControlStateNormal];
    [cell setSelected:NO animated:NO];
}


}
4

2 に答える 2

2

オーバーライドtouchesBegan:withEvent:するのではなく、カスタム セル オーバーライドsetSelected:animated:setHighlighted:animated:用意し、必要に応じて選択/強調表示されたときに処理する必要があります。

には複雑なビュー階層があるUITableViewため、セルのタッチを処理します。UITableViewCell

于 2013-03-19T19:16:24.567 に答える
1

多くの問題と同様に、問題はロジックではなく構文にありました。私は自分の UITable を "tableView" という愚かな名前にしました。これは、didSelectRowAtIndexPath で使用されるパラメーター UITable の名前でもあります。上に投稿したコードで気付いた場合は、didSelectRow() へのすべての呼び出しで、self.tableView が呼び出されます。むしろ、tableView を呼び出しているだけです。didSelectRowAtIndexPath メソッドが 1 回おきに呼び出される理由を正確に説明することはできませんが、このメソッドのパラメーター名を変更すると、すべてが機能します。

結論として、プロパティにパラメーター名と同じ名前を付けないでください。

于 2013-03-20T18:13:03.593 に答える