0

私は uitableviewcell に uibutton を追加しました。ここにテープが貼られているときに背景画像を変更しようとしているのがコードです

-(void)downloadImage:(UIButton *)link
{
    UITableViewCell *cell = (UITableViewCell*)[link superview];

    UIButton *view = [[UIButton alloc]init];
    NSArray *subviews = [cell subviews];

    for (view in subviews)
    {
        if([view isKindOfClass:[UIButton class]])
        {
            view = (UIButton*)subviews;
            [view setBackgroundImage:[UIImage imageNamed:@"yellow"] forState:UIControlStateNormal];
        }
    }
...

しかし、それは機能していません

この行を追加すると

ビュー = (UIButton*) サブビュー;

私はこのエラーが発生しています

スレッド 1:シグナル SIGTRAP

そして、この行がなければ何も起こっていません。何がうまくいかないのでしょうか?

4

1 に答える 1

2

サブビューを UITableViewCell に追加する方法によって異なります。

-(UITableViewCell)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellID = @"cellID";

    UITableViewCell *cell = [tableView dequeReusableCellForID:cellID];

    if(cell == nil)
    {
        ...

        myButton = [[UIButton alloc] initWithFrame....];
        [myButton addTarget:self selector:@selector(downloadImage:) forControlEvent:UIControlEventTouchUpInside];

        // -------------------------------------------------------
        // This is the important part here.
        // Usually, we add "myButton" to the cell's contentView
        // You will need to match this subview hierarchy
        // in your "downloadImage:" method later
        // -------------------------------------------------------

        [cell.contentView addSubview:myButton];
    }

    return cell;
}

-(void)downloadImage:(id)sender
{
    // -------------------------------------------------------
    // Here, "sender" is your original "myButton" being tapped
    //
    // Then "[sender superview]" would be the parent view of your
    // "myButton" subview, in this case the "contentView" of
    // your UITableViewCell above.
    //
    // Finally, "[[sender superview] superview]" would be the
    // parent view of the "contentView", i.e. your "cell"
    // -------------------------------------------------------

    UIButton *button = (UIButton *)sender;

    // button now references your "myButton" instance variable in the .h file
    [button setBackgroundImage:[UIImage imagenamed:@"filename.png"] forControlState:UIControlStateNormal];
}

それが役立つことを願っています。

するとアプリがクラッシュする理由については、次のとおりです。

view = (UIButton*)subviews;

これは、「サブビュー」がすべてのサブビューの NSArray であるためです。iOS に NSArray * を UIButton * に型キャストするように指示していますが、その方法がわかりません。そのため、アプリがクラッシュする原因になります。

for ループでは、おそらく代わりに次のようなことをしたいと思うでしょう (ただし、上記の "downloadImage" メソッドを使用する場合は必要ありません)。

for (view in subviews)
{
    if([view isKindOfClass:[UIButton class]])
    {
        // ------------------------------------------------
        // When you go for(view in subviews), you're saying
        // view = [subviews objectAtIndex:i]
        //
        // Hence view = (UIButton *)subviews become
        // redundant, and not appropriate.
        // ------------------------------------------------

        //view = (UIButton*)subviews; // <--- comment out/delete this line here

        [view setBackgroundImage:[UIImage imageNamed:@"yellow"] forState:UIControlStateNormal];
    }
}
于 2012-10-18T08:07:00.860 に答える