UITableView 设置cell选中状态的问题

iOS 码拜 9年前 (2015-05-09) 1435次浏览 0个评论

在做一个多选功能
开始我设置某个cell的状态为:
cell.selected = yes;
然后表格显示后 这个cell左边就会有个小勾  但是我点击这个cell的时候它执行的代理的
tableView:didSelectRowAtIndexPath 这个方法  而不是
tableView:didDeselectRowAtIndexPath 这个方法

怎么设置才可以让你第一次点击cell的时候就去调用tableView:didDeselectRowAtIndexPath这个方法?

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];
引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

如果找不到系统提供的方法, 可以想想自己去实现。
比如下面这个是不是你想要的效果?
UITableView 设置cell选中状态的问题

如果是这样的话, 你可以在didSelectRowAtIndexPath用一个NSUserDefaults来记录你的当前选择, 然后在cellForRowAtIndexPath中显示对应的效果, 比如这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellTableIdentifier = @"CellTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellTableIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone; //选中cell时无色
    }
    
    cell.textLabel.text = voiceArr[indexPath.row];
    if ([[[NSUserDefaults standardUserDefaults]valueForKey:APP_CHANGEVOICE] isEqualToString:[resuleArr objectAtIndex:indexPath.row]])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[NSUserDefaults standardUserDefaults]setValue:[resuleArr objectAtIndex:indexPath.row] forKey:APP_CHANGEVOICE];
    
    AudioServicesPlaySystemSound([[resuleArr objectAtIndex:indexPath.row]integerValue]);
    
    [myTableView reloadData];
}


引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是否是因为你设置cell选中的方式不对。你通过cell.selected=YES;设置成选中状态,那么在点击这行时,由于不是通过代理方法didSelectRowAtIndexPath 来选中的,所以在触发这个代理方式的时候,会被再次选中,当再点击时,uitableview内部维护了一个状态,根据这个状态在点击时就会自动调用回调方法deSelectRowAtIndexPath. 这是我的理解。所以如果是我说的这样的话,那么你在设置某个cell被选中的时候就不能通过代码cell.selected=YES;来实现了,你需要,如下伪代码

-(void)viewDidAppear:(BOOL)animated {
       //////之所以在viewDidAppear中来设置某个cell被初始选中,目的是要在uitableview加载出来以后再做
       [super viewDidAppear:animated]; 

      //////这里假设你初始要选中的是第一行
     NSIndexPath *indexPath =[NSIndexPath indexPathForRow:0 inSection:0];
     [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
引用 4 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是发你的邮箱吗?  代码很少的

引用 6 楼 szj424607870 的回复:
Quote: 引用 4 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是发你的邮箱吗?  代码很少的

我上面又回答了,你先按我说的再试试,还不行的话,你就发我邮箱吧zhanglei5415@163.com

引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

楼主的问题我也遇到过
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  
    if (lastPath == indexPath) {
        return;
    }
   //lastPath在cell for row中 加载时当前indexpath,本函数中indexaPath为选中的path
    UITableViewCell *lastCell = [tableView cellForRowAtIndexPath:lastPath];
    lastCell.accessoryType = UITableViewCellAccessoryNone;
    UITableViewCell *currentCell = [tableView cellForRowAtIndexPath:indexPath];
    currentCell.accessoryType = UITableViewCellAccessoryCheckmark;
    lastPath = indexPath;
   currentCell.selectionStyle = UITableViewCellSelectionStyleNone;//cell选中的背景风格
}
lastPath在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中 lastPath = indexPath;

引用 7 楼 zhanglei5415 的回复:
Quote: 引用 6 楼 szj424607870 的回复:
Quote: 引用 4 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是发你的邮箱吗?  代码很少的

我上面又回答了,你先按我说的再试试,还不行的话,你就发我邮箱吧zhanglei5415@163.com

发了  我的邮箱424607870@qq.com  谢谢了

引用 8 楼 Kamto_6 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

楼主的问题我也遇到过
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
  
    if (lastPath == indexPath) {
        return;
    }
   //lastPath在cell for row中 加载时当前indexpath,本函数中indexaPath为选中的path
    UITableViewCell *lastCell = [tableView cellForRowAtIndexPath:lastPath];
    lastCell.accessoryType = UITableViewCellAccessoryNone;
    UITableViewCell *currentCell = [tableView cellForRowAtIndexPath:indexPath];
    currentCell.accessoryType = UITableViewCellAccessoryCheckmark;
    lastPath = indexPath;
   currentCell.selectionStyle = UITableViewCellSelectionStyleNone;//cell选中的背景风格
}
lastPath在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中 lastPath = indexPath;

这个是不是单选的  选另一行的时候就让上的变为未选中.  我的问题不是这样的 我的问题是多选的
假如一开始都没有cell选中的时候  点击某个cell它就会再左边打勾 然后cell为高亮状态 然后调用tableView:didSelectRowAtIndexPath 这个方法
但是如果一开始某个cell是选中状态(创建cell的时候cell.selected = yes),我点击这个cell 情况和上面是一样的,左边的勾没有消失也是调用上面的方法,点击第二次的时候左边的勾才消失,然后调用 tableView:didDeselectRowAtIndexPath 这个方法

40分
引用 9 楼 szj424607870 的回复:
Quote: 引用 7 楼 zhanglei5415 的回复:
Quote: 引用 6 楼 szj424607870 的回复:
Quote: 引用 4 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是发你的邮箱吗?  代码很少的

我上面又回答了,你先按我说的再试试,还不行的话,你就发我邮箱吧zhanglei5415@163.com

发了  我的邮箱424607870@qq.com  谢谢了

已回复。你去邮箱查一下吧。

引用 11 楼 zhanglei5415 的回复:
Quote: 引用 9 楼 szj424607870 的回复:
Quote: 引用 7 楼 zhanglei5415 的回复:
Quote: 引用 6 楼 szj424607870 的回复:
Quote: 引用 4 楼 zhanglei5415 的回复:
Quote: 引用 2 楼 szj424607870 的回复:
Quote: 引用 1 楼 zhanglei5415 的回复:

uitableview本身就提供多选功能,选中的状态的管理不需要自己再维护。允许uitableivew多选设置一个属性就可以了,这时

self.tableView.allowsMultipleSelectionDuringEditing=YES;
[self.tableView setEditing:YES]; //////设置uitableview为编译状态

/////同时还有一个属性保存了你当前选择的indexPath集合
NSArray *indexPaths =[self.tableView indexPathsForSelectedRows];

//
我现在有个问题就是  一开始显示表格的时候就让某一个cell是选中的状态(左边有个勾)  然后我点击这个cell让他不选中
但是 每次我都要点击两次 那个cell的选中状态(就是个勾)才会消失  怎么然他一开始是选中的后点一下它就变为不选中呢?

没碰到你说的情况, 打个包我帮你看看

是发你的邮箱吗?  代码很少的

我上面又回答了,你先按我说的再试试,还不行的话,你就发我邮箱吧zhanglei5415@163.com

发了  我的邮箱424607870@qq.com  谢谢了

已回复。你去邮箱查一下吧。

太感谢了,解决了,接受建议,以后会多动手的

你好,我按照上面的提示自己解决这个问题,但是现在出现新的问题,cell复用的时候,崩溃在 [_tableView selectRowAtIndexPath:indexpath animated:YES scrollPosition:UITableViewScrollPositionNone];但是我的断点那里indexpath是有数据的,不知道什么原因啊,请大神指点
引用 13 楼 patty_xp 的回复:

你好,我按照上面的提示自己解决这个问题,但是现在出现新的问题,cell复用的时候,崩溃在 [_tableView selectRowAtIndexPath:indexpath animated:YES scrollPosition:UITableViewScrollPositionNone];但是我的断点那里indexpath是有数据的,不知道什么原因啊,请大神指点

是否是执行的时机不对,uitableview还没有加载完数据。在viewDidAppear这个方法中处理。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明UITableView 设置cell选中状态的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!