1

私はテーブルビューを設計しました。メッセージを送信するための[フォロワーの選択]リスト用に、そこでいくつかのフォロワーを選択して、Twitterでメッセージを送信できます。

これを行うために、UITableViewCellAccessoryCheckmarkでUITableViewを使用しています。

ここに画像の説明を入力してください

しかし、テーブルを下にスクロールすると、チェックされている行は毎回チェックされていません。

FollowerListView.hで選択したフォロワーのテーブルビューと配列をクリアしました

@interface FollowersListView : UIViewController<UITableViewDelegate,UITableViewDataSource>{

IBOutlet UITableView *tableFollowers;

NSMutableArray *listFollowrsName;   
NSMutableArray *listSelectedFollowrsId;
}

@property(nonatomic,retain) NSMutableArray *listFollowrsName;    
@property(nonatomic,retain) NSMutableArray *listSelectedFollowrsId;

@end

そして私のテーブルビューコードはFollowersListView.mファイルでこのようになっています

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return [listFollowrsName count];
}



- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CellWithSwitch"];
    //if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellWithSwitch"] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont systemFontOfSize:14];

    //cell.accessoryType = UITableViewCellAccessoryCheckmark;
    cell.accessoryType = UITableViewCellStyleDefault;
    //}

    NSString *cellValue = [listFollowrsName objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;    

    return cell;
}

//to select a row
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)path {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];


    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        cell.accessoryType = UITableViewCellAccessoryNone;        
        NSLog(@"row is un-checked %@",[NSNumber numberWithInt:path.row]);
        [listSelectedFollowrsId removeObject:[NSNumber numberWithInt:path.row]];
        NSLog(@"Now selected person are%@",listSelectedFollowrsId);

    } else {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        NSLog(@"row is checked %@",[NSNumber numberWithInt:path.row]);
        [listSelectedFollowrsId addObject:[NSNumber numberWithInt:path.row]];       
        NSLog(@"Now selected person are%@",listSelectedFollowrsId);
    }

}

すでに保存されている選択リストに従ってすべてのセルをロードする必要があると思いますが、その方法はわかりません。

誰かが私が間違っているところを案内できますか、助けていただければ幸いです

編集

@Novarg

「 listSelectedFollowrsId」を.hファイルのNSMutable配列として宣言し、viewDidLoadメソッドで初期化してから、 didSelectRowAtIndexPathメソッドで値を追加/削除して、選択した行を管理しました。

4

4 に答える 4

5

重要なのは、スクロールするたびに新しいセルを作成することです。条件がそこにある必要があります。if (cell == nil)そうでない場合は、セルを何度も何度も書き直し続けることになります。

次のことを試してください。

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CellWithSwitch"];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellWithSwitch"] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.font = [UIFont systemFontOfSize:14];
    cell.accessoryType = UITableViewCellStyleDefault;
  }
  NSString *cellValue = [listFollowrsName objectAtIndex:indexPath.row];
  cell.textLabel.text = cellValue;    
  return cell;
}

動作しない可能性があります。現在Windowsマシンを使用しているため、コードをコンパイルして自分でテストすることはできません。

それが役に立てば幸い

編集

それでも問題が解決しない場合は、NSMutableDictionary「チェック」された名前の記録を保持するための変数(おそらく)も追加します。return cell;これを使用して、cellForRowAtIndexPath:メソッドの直前に次を追加できます。

if ([[theDictionary objectForKey:/*your key here, can be anything*/]isEqualToString:/*string or whatever, just make sure that the checked ones are different from the unchecked ones*/])
  cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
  cell.accessoryType = UITableViewCellAccessoryNone;

編集2

直前に追加する必要があるものは次のとおりです(以前は配列return cell;が表示されていませんでした)。listSelectedFollowrsId

cell.accessoryType = UITableViewCellAccessoryNone;
for (int i = 0; i < [listSelectedFollowrsId count]; i++) {
  if ([[listSelectedFollowrsId objectAtIndex:i]intValue] == indexPath.row) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
  }
}

これにより、行が以前にタップされている場合、アクセサリがチェックマークに設定されます。

于 2012-08-10T09:07:23.860 に答える
1

あなたはこれを使うことができます:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)

    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];        
        cell.backgroundColor=[UIColor clearColor];        
        cell.selectionStyle=UITableViewCellSelectionStyleNone;      
        cell.accessoryType=UITableViewCellAccessoryNone;            
    }
    else
    {
        UIView *subview;
        while ((subview= [[[cell  contentView]subviews]lastObject])!=nil)       
            [subview removeFromSuperview];            
    }

    NSString *cellValue = [listFollowrsName objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;    
    return cell;
}
于 2012-08-10T09:23:29.247 に答える
0

これは、テーブルをスクロールすると、cellForRowAtIndexPathが呼び出されるためです。

この関数では、セルを何度も作成しています。そのため、didSelectRowAtIndexPathでマークしたチェックマークが削除されます。

テーブルビューの詳細な例については、このリンクを参照してください。

于 2012-08-10T09:04:28.703 に答える
0

cellForRowAtIndexPathでは、常にオフに設定しています。その行が選択したフォロワーのリストに含まれているかどうかをテストする必要があります。含まれている場合は、それに応じてアクセサリを設定します。

これはすべて、数千行のテーブルでもメモリ消費を低く抑えるためのセルの再利用によるものです。

于 2012-08-10T09:06:21.377 に答える