【问题标题】:How collapse the expanded cell when tapped for the second time on the cell?第二次点击单元格时如何折叠展开的单元格?
【发布时间】:2015-06-14 09:01:58
【问题描述】:

我已经构建了一个示例可扩展的 tableview 项目。一切正常。现在,当我第二次点击同一个单元格时,我想最小化展开的单元格。谁能给我任何想法我该怎么做?非常感谢任何帮助。

这是我的代码

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    NSMutableArray *arrSelected;
    NSIndexPath *selectedRowIndex;
    BOOL *isTwoTaps;

}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.arrFields = @[@"Personal Info", @"Education", @"Hobbies", @"Interest"];
    self.arrPersonalInfo = @[@"First Name", @"Last Name", @"Age", @"Phone Number",@"Address"];
    self.arrEducation = @[@"10", @"10+2", @"Graduation", @"Masters", @"Higher Studies"];
    self.arrHobbies = @[@"Sports", @"Cooking", @"Music", @"Gardening", @"Fishing"];
    self.arrInterest = @[@"Collection", @"Space", @"Medical", @"Engineering", @"Programming"];
    [self.tableView setAllowsMultipleSelection:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.arrFields count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *cellIdentifier=@"CellA";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    UIView *vw=(UIView *)[cell.contentView viewWithTag:999];
    UILabel *lblField = (UILabel *)[cell.contentView viewWithTag:1];
    lblField.text = [self.arrFields objectAtIndex:indexPath.row];

    UILabel *lblDetail1 = (UILabel *)[cell.contentView viewWithTag:2];
    UILabel *lblDetail2 = (UILabel *)[cell.contentView viewWithTag:3];
    UILabel *lblDetail3 = (UILabel *)[cell.contentView viewWithTag:4];
    UILabel *lblDetail4 = (UILabel *)[cell.contentView viewWithTag:5];
    UILabel *lblDetail5 = (UILabel *)[cell.contentView viewWithTag:6];


    if([[self.arrFields objectAtIndex:indexPath.row]isEqualToString:@"Personal Info"]) {

        lblDetail1.text = [self.arrPersonalInfo objectAtIndex:indexPath.row];

        lblDetail2.text = [self.arrPersonalInfo objectAtIndex:indexPath.row+1];

        lblDetail3.text = [self.arrPersonalInfo objectAtIndex:indexPath.row+2];

        lblDetail4.text = [self.arrPersonalInfo objectAtIndex:indexPath.row+3];

        lblDetail5.text = [self.arrPersonalInfo objectAtIndex:indexPath.row+4];

        NSLog(@"%@", [self.arrFields objectAtIndex:indexPath.row]);


    }
    else if ([[self.arrFields objectAtIndex:indexPath.row]isEqualToString:@"Education"]){

        lblDetail1.text = [self.arrEducation objectAtIndex:indexPath.row-1];

        lblDetail2.text = [self.arrEducation objectAtIndex:indexPath.row];

        lblDetail3.text = [self.arrEducation objectAtIndex:indexPath.row+1];

        lblDetail4.text = [self.arrEducation objectAtIndex:indexPath.row+2];

        lblDetail5.text = [self.arrEducation objectAtIndex:indexPath.row+3];

    }
    else if ([[self.arrFields objectAtIndex:indexPath.row]isEqualToString:@"Hobbies"]){

        lblDetail1.text = [self.arrHobbies objectAtIndex:indexPath.row-2];

        lblDetail2.text = [self.arrHobbies objectAtIndex:indexPath.row-1];

        lblDetail3.text = [self.arrHobbies objectAtIndex:indexPath.row];

        lblDetail4.text = [self.arrHobbies objectAtIndex:indexPath.row+1];

        lblDetail5.text = [self.arrHobbies objectAtIndex:indexPath.row+2];

   }
    else if([[self.arrFields objectAtIndex:indexPath.row]isEqualToString:@"Interest"]){

        lblDetail1.text = [self.arrInterest objectAtIndex:indexPath.row-3];

       lblDetail2.text = [self.arrInterest objectAtIndex:indexPath.row-2];

       lblDetail3.text = [self.arrInterest objectAtIndex:indexPath.row-1];

       lblDetail4.text = [self.arrInterest objectAtIndex:indexPath.row];

        lblDetail5.text = [self.arrInterest objectAtIndex:indexPath.row+1];

}

   if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {

         vw.hidden=FALSE;
    }
    else
   {
      vw.hidden=TRUE;
    }
    return cell;

}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

  if(selectedRowIndex)
   {
       [tableView reloadData];
   }


    selectedRowIndex = indexPath ;

    [tableView beginUpdates];

    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    [tableView endUpdates];

}

   - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {

        return 222;

    }
    else{

        return 44;

    }

}

【问题讨论】:

  • 你需要使用uitapgesturerecognizer,需要将点击次数设置为2。看看stackoverflow.com/questions/8876202/…
  • 如果没有 uitapgesturerecognizer 并且只能使用方法 didSelectRowAtIndexPath,我不能这样做吗? @AkashShinde
  • 你可以使用didSelectRowAtIndexPath,当你点击单元格时这个代理方法会被调用,所以在这个方法下放上uitapgesturerecognizer代码,它会识别双击它会展开。

标签: ios objective-c uitableview


【解决方案1】:

取一个像 isCellExpanded 这样的布尔变量,第一次点击时将该值设为真,当用户再次点击时设为假。

【讨论】:

  • 我理解你的逻辑,但如何知道用户是否第二次点击?更清楚地在哪里使布尔值为假? @SIVAJEE
  • 在 didSelectRowAtIndexPath 中使用它。像这样: if (isExapndableListOpen) { isExapndableListOpen=false; }
  • 我不明白你的意思。首先,布尔何时为真,何时为假。如果您可以发布一些代码,那就太好了。其次,当布尔为假时,我是否需要编写任何代码来最小化单元格? @SIVAJEE
【解决方案2】:

试试这个

@implementation ViewController
{
    NSMutableArray *arrSelected;
    NSIndexPath *selectedRowIndex;
    BOOL *isTwoTaps;
    NSInteger selectedIndex;

}

 - (void)viewDidLoad {
     [super viewDidLoad];

    selectedIndex=-1;
  }

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{

  if(selectedRowIndex)
  {
       [tableView reloadData];
  }


  selectedRowIndex = indexPath ;
  if (selectedIndex==indexPath.row)
  {
      selectedIndex=-1;
  }
  else
 {
      selectedIndex=indexPath.row;
 }

[tableView beginUpdates];

[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

[tableView endUpdates];

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

     if(selectedIndex==indexPath.row) {

        return 222;

    }
    else{

        return 44;

     }

 }

【讨论】:

  • 没有最小化。 :(@南都
  • 老兄它的工作正常。 @Nandu 只想从你这里知道两件事。首先,大众没有隐藏,因此在最小化单元格后是不可见的。其次,如果你能告诉我你到底做了什么。我只想知道逻辑。
  • 在 didselect 方法中访问 vw 并相应地使用它。我取了一个 NSInteger 变量 selectedIndex 并在 viewDidLoad 中将它的值分配为“-1”。当您选择单元格时,我会相应地使用变量检查所选索引。当第一次选择单元格时,我将选定的行索引分配给变量“selectedIndex”,当您再次选择相同的单元格时,我将“selectedIndex”分配给-1。在 heightForRowAtIndexPath 中,我仅根据该变量设置单元格的高度。
  • 高度赞赏!! :) @南都
猜你喜欢
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多