我设计了一个Table视图,For Select Followers列表发送消息, 所以,我可以选择一些粉丝,然后在推特上发送消息。
我正在使用UITable View和UITableViewCellAccessoryCheckmark来制作 此
但是当我向下滚动表格时,每个选中的行都会被取消选中 时间。
我在 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>
答案 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中,您始终将其设置为未选中。您需要测试该行是否在您选择的关注者列表中,如果是这样,请相应地设置该配件。
这完全归功于单元重用,即使对于包含数千行的表,也能保持较低的内存消耗。