2

4 つのセクションを持つ基本的な UITableView があります。Switch ステートメントを使用して、各セクションのコンテンツを制御します。

最初の 3 つのセクションの行に表示されるボタンをプログラムで作成しますが、4 番目のセクションには表示されません。ただし、ボタンは 4 番目のセクションの行にランダムに表示されます。

これは、セルが再利用されているためだと思いますが、Switch ステートメントで各セクションの行を作成すると、これがどのように発生するのかわかりません。どんなアイデアでも大歓迎です。

私は次のように構成されたカスタムセルを使用しています:`

static NSString *CustomCellIdentifier = @"DashboardCell";

DashboardCell *cell = (DashboardCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];

if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DashboardCell"
                                                                owner:self options:nil];
    for (id oneObject in nib) if ([oneObject isKindOfClass:[DashboardCell class]])
        cell = (DashboardCell *)oneObject;
}

// Configure the cell.`

このボタンを作成するコードは次のとおりです。

        button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(200, 11, 50, 50);        
        UIImage *iConnect = [UIImage imageNamed:@"connect.png"];
        [button setImage:iConnect forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:button];`
4

4 に答える 4

11

コンテンツの種類ごとに異なる再利用識別子が必要です。つまり、ここには 2 種類のコンテンツがあります。セルには がありUIButton、セルにはありません。

メソッドの を使用して、indexPath@ tableView:cellForRowAtIndexPath:"CellWithButton" または @"CellWithoutButton" のいずれかの再利用識別子を選択します。

コードで実際に起こっていることは、すべてのセルに同じ再利用識別子が与えられていることです。つまり、すべてのセルが同じオブジェクト プールに入れられます。これは、これを使用する[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];と、この 1 つのプールからセルを取得していることを意味します (このプールには、存在しないUIButtonセルと存在するセルが含まれる可能性があります)。UIButtonしたがって、dequeue メソッドは、既に追加されているセルをランダムに返すことができます。2 つの再利用 ID を使用すると、UITableViewは 2 つのオブジェクト プールをセットアップし、それぞれから適切なセルを正しく保管および取得します。

UIButtonまたは、1 つの再利用プールを使用して、dequeue メソッドを使用してプールを取得するたびにセルをチェックすることもできます。

于 2012-05-27T17:12:49.570 に答える
7

DashboardCell で、プロパティを作成します@property (nonatomic, assign) BOOL buttonEnabled。次にawakeFromNib、常にボタンを作成して設定しbutton.hidden = YESます。プロパティのセッターをオーバーライドする

- (void)setButtonEnabled:(BOOL)enabled {
   buttonEnabled = enabled;
   button.hidden = !enabled;
}

そして最後にオーバーライドprepareForReuse

- (void)prepareForReuse {
   [super prepareForReuse];
   self.buttonEnabled = NO;
}

そして、メソッド cellForRowAtIndexPath の構成部分で有効化/無効化できるようになりました

于 2012-05-27T16:10:19.443 に答える
1

セクションに応じて、2 つの異なるセル識別子を使用できます。それ以外の場合は、返されたセルにボタンが存在するかどうかを確認し、必要に応じてボタンdequeueReusableCellWithIdentifier:を追加するか、既存のボタンを削除する必要があります。

于 2012-05-27T15:59:18.523 に答える
0

これらのセルを再利用する予定で、各セルのボタンを表示または非表示にする簡単なロジックがある場合は、Interface Builder でボタンを作成し、UITableViewDelegate にアウトレットとして接続することをお勧めします。

次に、セルを壊すことなくいつでも何度でも実行できるセルのセットアップ メソッドを作成します。

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

    DashboardCell *cell = (DashboardCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];

    if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DashboardCell"
                                                                owner:self options:nil];
        for (id oneObject in nib) if ([oneObject isKindOfClass:[DashboardCell class]])
            cell = (DashboardCell *)oneObject;
    }

    // Configure the cell.
    [cell setupWithSomeConfigOptions:someConfigOptions]

    return cell;
}

そして、あなたの cell サブクラスには、 method が-(void)setupWithSomeOptions:(SomeOptions)someOptionsあり、これは次のようなものになります:

-(void)setupWithSomeOptions:(SomeOptions)someOptions
{
    // some setup code

    self.myButtonOutlet.hidden = someOptions.somePropertyToCheckIfButtonShouldBeHidden;

    // some more setup code
}
于 2012-05-27T17:43:46.323 に答える