UITableView Cell突出显示/保留选定值IOS

时间:2014-01-09 09:57:56

标签: objective-c uitableview ios7 highlight

UIView(LeftMenu)与UITableView (UITableViewStylePlain)。我有大约7个控制器,在每个单元格的选择上我想推动相应的控制器。我尝试了黄色单元格的自定义高亮,如下所示,

  UIColor *yel=[[UIColor alloc]initWithRed:240/255.0 green:197/255.0 blue:67/255.0 alpha:1.0];
  UIView *bgColorView = [[UIView alloc] init];
  [bgColorView setBackgroundColor:yel];
  [cell setSelectedBackgroundView:bgColorView];
cellForRowAtIndexPath中的

。但我无法保留选定的单元格如果我移动到下一个控制器。在didSelectRowAtIndexPath中,我正在捕获最后选择的索引(当我选择新单元格时,旧的应该是未突出显示的)。但似乎,如果我使自定义它不保留。如果我保留UITableViewCellSelectionStyleNonecell.backgroundColor就行了。但没有强调:(

  [[NSUserDefaults standardUserDefaults]setInteger:indexPath.row forKey:@"SSLastSelectedLeftMenuIndex"];

我正在用框架初始化UIView(LeftMenu)。

问题:几分钟后高亮显示灰色,自定义黄色高亮显示并且不保留选定的单元格颜色。

我知道我错过了一些愚蠢的事情。但是它在吃我的时间。提前谢谢:)

更新: - 以下是我的-cellForRowAtIndexpath方法

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
if([[NSUserDefaults standardUserDefaults]integerForKey:@"SSLastSelectedLeftMenuIndex"]==indexPath.ro‌w)
{
    ///<HIGHLIGHT CODE>;
}

3 个答案:

答案 0 :(得分:1)

选择最后选择的单元格..(尝试)


- (void)viewWillAppear
   {
       [uper viewWillAppear];

       //hear u can set the selected cell
       //get indexpath of row
       int k = your saved row
       NSIndexPAth *path = [NSIndexPath indexPathWithIndex:k];//if u hav single section or u can use other class method
      [tableView selectRowAtIndexPath:_selctedIndex animated:NO scrollPosition: UITableViewScrollPositionNone];//hear u are directly setting the last selected cell once view will appear

   }


跳这有助于你:)

如果您正在使用UITableViewCell,那么你会做这样的事情,黄色用于选择单元格


     //in controller do like this
     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        if(cell == nil)
        {
           cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

          UIColor *yel=[[UIColor alloc]initWithRed:240/255.0 green:197/255.0 blue:67/255.0 alpha:1.0];
          UIView *bgColorView = [[UIView alloc] init];
         [bgColorView setBackgroundColor:yel];
         [cell setSelectedBackgroundView:bgColorView];

       }

      return cell;

   }


在子类表格单元格中有一种方法,用于显示黄色以选择单元格


  //in CustomCell.m
  //in the custom cell set the color for selected state
  //override this method
   - (void)setSelected:(BOOL)selected animated:(BOOL)animated
   {
        [super setSelected:selected animated:animated];

         // Configure the view for the selected state
         if(selected)
         {
             //same code of urs
             UIColor *yel=[[UIColor alloc]initWithRed:240/255.0 green:197/255.0 blue:67/255.0 alpha:1.0];
             UIView *bgColorView = [[UIView alloc] initWithFrame:self.bounds];//for entaire cell,set the frame
             [bgColorView setBackgroundColor:yel];
             [self setSelectedBackgroundView:bgColorView];
         }
     }


答案 1 :(得分:0)

您误解了选择并突出显示了一个单元格,您应该更改下面的cellForRowAtIndexPath以选择之前选择的项目。

之前声明一个类型为NSIndexpath的全局变量_selctedIndex来存储最后选择的单元格

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        UIColor *yel=[[UIColor alloc]initWithRed:240/255.0 green:197/255.0 blue:67/255.0 alpha:1.0];
        UIView *bgColorView = [[UIView alloc] init];
        [bgColorView setBackgroundColor:yel];
        [cell setSelectedBackgroundView:bgColorView];

    }
    if([[NSUserDefaults standardUserDefaults]integerForKey:@"SSLastSelectedLeftMenuIndex"]==indexPath.row)
    {
        //<HIGHLIGHT CODE>;
        _selctedIndex=indexPath;   //code Updated
    }
return cell;
}

在你的tableView重新加载后调用下面的代码行

[tableView selectRowAtIndexPath:_selctedIndex animated:NO scrollPosition:UITableViewScrollPositionTop];
    }

UITableViewCell类会将您提到的视图分配给属性selectedBackgroundView而不是默认蓝色视图,以便在选择单元格时在后台显示

答案 2 :(得分:0)

我在项目中遇到了完全相同的问题,当点击一个单元格足够长时间以进行突出显示然后移动到滚动时,UITableView以某种方式保持突出显示的索引,以便下一次选择尝试使用之前的indexPath。 / p>

要解决我做了以下

添加属性以跟踪违规indexPath

...
@property (nonatomic,strong) NSIndexPath *cachedPath;
...

使用didUnhighlightRowAtIndexPath跟踪indexPath

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.cachedPath = indexPath;
}

On Drag reload违规indexPath

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if (self.cachedPath)
    {
        [self.tableView reloadRowsAtIndexPaths:@[self.cachedPath] withRowAnimation:UITableViewRowAnimationNone];
    }
    self.cachedPath = nil;
}

为了好的措施,请清除选择中的属性

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.cachedPath = nil;
}