2


次のようにasUITableViewCellを使用するサブクラスがあります。 すべて問題あり ません。アプリは正常に動作します。 UISwitchaccessoryView
mySwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
self.accessoryView = mySwitch;


ここで、スイッチの上にいくつか追加する必要があるUIImageViewので、「さて、カスタムのaccessoryViewを作ろう!」と思いました:すべて問題ないように見えますが、奇妙な動作があります. 別のViewControllerを開いてテーブルに戻ると、不思議なことにスイッチが変更されています... データ管理の問題ではなく、セルの再描画の問題だけです...助けてください、どうすればよいですか?
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 10.0f, 100.0f, 60.0f)];
...
mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0.0f, 22.0f, 94.0f, 27.0f)];
[myView addSubview:mySwitch];
self.accessoryView = myView;
[myView release];


前もって感謝します

4

2 に答える 2

2

これは、セルが再利用されるために発生します。したがって、サブビューをセルのコンテンツ ビューに追加し、そのセルが別の行で再利用された後、そのビューがその行に表示されます。これを回避する最善の方法は、すべてのカスタム ビュー (サブビューを含む) を含むテーブルのデータ ソース (通常はビュー コントローラー) に NSArray を保持することです。次に、次のようにできます。

-(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath {
    NSInteger row = indexPath.row;
    static NSString* cellIdentifier = @"Trololo";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];
    if( !cell ) {       
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier: cellIdentifier] autorelease];
    }

    [[cell.contentView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
    [cell.contentView addSubview: [_your_cell_views objectAtIndex: row]];

    return cell;
}
于 2011-02-12T02:40:38.160 に答える
0

ええと...問題が見つかりました...テーブルの再描画にリンクされていませんでした...セレクターで、
この方法でUIControlEventValueChangedスイッチ値とセルを取得します。 次に、保存された(データロジッククラスの)対応するオブジェクトを更新します(テーブルビューのデータソース)で しかし、スイッチはaccessoryViewではなく、accessoryViewのサブビューであるため、オブジェクトは予測できない方法で更新されます。私は2番目のメッセージ で解決しました。 私の間違いをお詫びし、皆様に感謝します...indexPath.row
UISwitch *tempSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)[tempSwitch superview];

NSMutableArray

superview

于 2011-02-12T14:58:15.870 に答える