每当我在iOS中滚动时,为什么UITable行都会被取消选中

时间:2012-08-10 09:02:01

标签: iphone ios uitableview

我设计了一个Table视图,For Select Followers列表发送消息, 所以,我可以选择一些粉丝,然后在推特上发送消息。

  

我正在使用UITable View和UITableViewCellAccessoryCheckmark来制作   此

enter image description here

  

但是当我向下滚动表格时,每个选中的行都会被取消选中   时间。

我在 FollowersListView.h

中有一个十进制表视图和一个选定关注者的数组
@interface FollowersListView : UIViewController<UITableViewDelegate,UITableViewDataSource>{

IBOutlet UITableView *tableFollowers;

NSMutableArray *listFollowrsName;   
NSMutableArray *listSelectedFollowrsId;
}

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

@end

我的tableview代码在 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 方法中添加/删除值以管理所选行。< / p>

4 个答案:

答案 0 :(得分: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)来记录已经检查过的名称&#34;。使用它,您可以在return cell;方法{<1}}之前添加以下内容:

cellForRowAtIndexPath:

编辑2

以下是您应该在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; 之前添加的内容(之前没有看到return cell;数组):

listSelectedFollowrsId

如果先前已点过该行,则会将附件设置为复选标记。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

因为滚动表时会调用cellForRowAtIndexPath。

在此功能中,您将反复创建单元格。因此,您的检查标记将被删除,您已在didSelectRowAtIndexPath中标记。

有关tableview的详细示例,请参阅此link

答案 3 :(得分:0)

在cellForRowAtIndexPath中,您始终将其设置为未选中。您需要测试该行是否在您选择的关注者列表中,如果是这样,请相应地设置该配件。

这完全归功于单元重用,即使对于包含数千行的表,也能保持较低的内存消耗。