0

カスタムUITableViewCellを備えたUITableViewがあります。

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

//create the cell
MyCell *cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
cell.label.text = ..
cell.label2.text = ..
cell.label3.text = ..

すべてが正常に機能し、すべてのデータが適切に読み込まれるなど。

これで、このView Controllerに、ユーザーが表示するラベルを選択できる別のビューを開くボタンがあります。したがって、たとえば、ラベル1と3を表示しますが、2は表示しません...次に、Doneをクリックすると、新しいオプションを反映するようにtableViewを更新しますが、セルにはreuseCellIdがロードされているため、変更は表示されません。 。セルを強制的に再作成するにはどうすればよいですか?

4

3 に答える 3

0

これは良いアプローチではありません
セルを更新するときに別の識別子を使用してこれを行う1つの方法

これを行う他のより良い方法があるかどうかはわかりません。

于 2012-07-27T15:31:49.270 に答える
0

私ができる最善のことは、セル構成をある種の構造に格納し(ここでは、表示されるラベルインデックスのセットで問題ありません)、ボタンを使用してこの構造を変更し、テーブルビューを再読み込みすることです。次に、tableView:cellForRowAtIndexPath:メソッドで、どのボタンを表示するかを知るために、その構成構造を確認する必要があります。

このコードは役立つかもしれません:

@interface MyViewController : UIViewController
{
    ...
    NSMutableSet *_labelsToShow;
}

...
@property (nonatomic, retain) NSMutableSet labelsToShow

@end


@implementation MyViewController
@synthesize labelsToShow = _labelsToShow;

- (void)dealloc
{
    [_labelsToShow release];
    ...

}


//you may know which button has to add/remove each label, so this needs to be fixed with your logic
- (IBAction)myButtonAction:(id)sender
{
    if (hasToShowLabel)
    {
        [self.labelsToShow addObject:[NSNumber numberWithInteger:labelIdentifier]];
    } else
    {
        [self.labelsToShow removeObject:[NSNumber numberWithInteger:labelIdentifier]];
    }
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"myCell";
    MyCustomCell *cell = (MyCustomCell *)[tableView dequeReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault] autorelease];
    }

    cell.label0.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:0]]);
    cell.label1.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:1]]);
    cell.label2.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:2]]);
    ...

    return cell;
}


@end

これで頑張ってください!

于 2012-07-27T15:44:30.390 に答える
0

テーブルビューを破棄し、毎回再作成することで、この問題を解決しました。

于 2012-07-27T19:12:08.210 に答える