【问题标题】:Issue on TableView CellTableView 单元格上的问题
【发布时间】:2016-02-08 10:06:49
【问题描述】:

这里我正在开发一个扩展 TableViewCell ,而 TableView didSelectRowAtIndexPath 方法我用来扩展单元格,这里我使用了两个 TableView 单元格

但我需要按钮操作 SecondCell 将被展开。你能帮我如何实现这里是下面的代码,

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
        // disable touch on expanded cell
    UITableViewCell *cell = [self.theTableView cellForRowAtIndexPath:indexPath];
    if ([[cell reuseIdentifier] isEqualToString:@"ExpandedCellIdentifier"]) {
        return;
    }

        // deselect row
    [tableView deselectRowAtIndexPath:indexPath
                             animated:NO];

        // get the actual index path
    indexPath = [self actualIndexPathForTappedIndexPath:indexPath];

        // save the expanded cell to delete it later
    NSIndexPath *theExpandedIndexPath = self.expandedIndexPath;

        // same row tapped twice - get rid of the expanded cell
    if ([indexPath isEqual:self.expandingIndexPath]) {
        self.expandingIndexPath = nil;
        self.expandedIndexPath = nil;
    }
        // add the expanded cell
    else {
        self.expandingIndexPath = indexPath;
        self.expandedIndexPath = [NSIndexPath indexPathForRow:[indexPath row] + 1
                                                    inSection:[indexPath section]];
    }

    [tableView beginUpdates];

    if (theExpandedIndexPath) {
        [_theTableView deleteRowsAtIndexPaths:@[theExpandedIndexPath]
                             withRowAnimation:UITableViewRowAnimationNone];
    }
    if (self.expandedIndexPath) {
        [_theTableView insertRowsAtIndexPaths:@[self.expandedIndexPath]
                             withRowAnimation:UITableViewRowAnimationNone];
    }

    [tableView endUpdates];

        // scroll to the expanded cell
    [self.theTableView scrollToRowAtIndexPath:indexPath
                             atScrollPosition:UITableViewScrollPositionMiddle
                                     animated:YES];
}

但我想在点击按钮时实现 secondCell 将展开。

- (IBAction)expand:(id)sender {

}

你能帮帮我吗,谢谢。

【问题讨论】:

    标签: ios objective-c iphone xcode tableviewcell


    【解决方案1】:

    这是我的解决方案,您可以通过禁用大小类创建单独的 .xib 文件轻松实现逻辑。使用布尔变量来检查它是否被选中。如果是这样,则重新加载特定单元格并使用委托方法 heightforrow 并在此处确定该布尔变量。这很简单……希望你能理解。如果没有,请告诉我。我将分享我的代码。

    编辑了帖子,下面是我的代码:-

        @implementation ViewController
        BOOL sel=NO;
        NSMutableArray *a,*b;
        NSIndexPath *path;
        - (void)viewDidLoad {
            [super viewDidLoad];
            a=[[NSMutableArray alloc] initWithObjects:@"Apple",@"Mango",@"Orange",@"Pineapple",@"Cricket",@"Bike",@"Music", nil];
            b=[[NSMutableArray alloc] initWithArray:a copyItems:YES];
                [self.tview registerNib:[UINib nibWithNibName:@"cell1" bundle:nil] forCellReuseIdentifier:@"cell"];
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        - (void)didReceiveMemoryWarning {
            [super didReceiveMemoryWarning];
            // Dispose of any resources that can be recreated.
        }
    
        -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
            return a.count;
        }
    
    
        -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
            return 1;
        }
    
    
        -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
            [tableView beginUpdates];
            if([[a objectAtIndex:indexPath.row] isEqualToString:@"Selected"]){
                sel=NO;
            [a replaceObjectAtIndex:indexPath.row withObject:[b objectAtIndex:indexPath.row]];
            }
            else{
            [a replaceObjectAtIndex:indexPath.row withObject:@"Selected"];
                sel=YES;
            }
    
            [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
            [tableView endUpdates];
        }
    
        -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
            if([[a objectAtIndex:indexPath.row] isEqualToString:@"Selected"]){
            return 100;
        }
            return 60;
        }
    
        -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
            static NSString *cellIdentifier = @"cell";
            cell1 *cell = (cell1 *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
            // If there is no cell to reuse, create a new one
            /*  if(cell == nil)
             {
             cell = [[listcustomcell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
             }*/
            if (!cell)
            {
                cell = [[cell1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
            }
            NSLog(@"%f",[self tableView:self.tview heightForRowAtIndexPath:indexPath]);
            cell.btn.frame=CGRectMake(cell.btn.frame.origin.x, [self tableView:self.tview heightForRowAtIndexPath:indexPath]*0.3, cell.btn.frame.size.width*1.3, cell.btn.frame.size.height);
            UIButton *b=[[UIButton alloc] initWithFrame:cell.btn.frame];
    
            [cell.btn removeFromSuperview];
            [b setTitle:@"button" forState:UIControlStateNormal];
            [cell.contentView addSubview:b];
            [b addTarget:self action:@selector(checkButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
            return cell;
        }
    
        - (void)checkButtonTapped:(id)sender
        {
            CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tview];
            NSIndexPath *indexPath = [self.tview indexPathForRowAtPoint:buttonPosition];
            if (indexPath != nil)
            {
    //Just make sure that you've selected no selection option for the tableview.
                [self tableView:self.tview didSelectRowAtIndexPath:indexPath];
                NSLog(@"You've selected a row %ld",(long)indexPath.row);
            }
        }
        @end
    

    创建一个单独的 .xib 并将按钮放在那里。要调整按钮框架的大小,您需要将其删除并在刷新时再次添加。希望对你有帮助:)

    【讨论】:

    • 嗨,Pradheep,谢谢你能分享你的代码,这会很有帮助
    • 谢谢@pradheep,我这样解决了,但我只需要在按钮点击单元格将展开时,而不是 didselectrow
    【解决方案2】:

    我浏览了你的代码,我认为你只需要获取单元格。请参阅下面的代码以获取它。

    CGPoint touchPoint = [textField convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    

    现在执行与didSelectRowAtIndexPath 相同的步骤。

    【讨论】:

      【解决方案3】:

      如果您想展开/折叠您的 tableView 单元格, 我制作了一个演示,可以为您提供所需的确切行为。这是链接:https://github.com/rushisangani/TableViewCellExpand

      请按照演示中的说明设置展开/折叠视图的约束。

      它基于 Content Hugging 和 Content Compression Resistance 优先级。

      【讨论】:

        【解决方案4】:
        - (IBAction)expand:(id)sender {
        CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.theTableView];
        
            NSIndexPath *indexPathInner = [self.theTableView indexPathForRowAtPoint:buttonPosition];
          // disable touch on expanded cell
            UITableViewCell *cell = [self.theTableView cellForRowAtIndexPath:indexPathInner];
            if ([[cell reuseIdentifier] isEqualToString:@"ExpandedCellIdentifier"]) {
                return;
            }
        
                // deselect row
            [tableView deselectRowAtIndexPath:indexPath
                                     animated:NO];
        
                // get the actual index path
            indexPath = [self actualIndexPathForTappedIndexPath:indexPath];
        
                // save the expanded cell to delete it later
            NSIndexPath *theExpandedIndexPath = self.expandedIndexPath;
        
                // same row tapped twice - get rid of the expanded cell
            if ([indexPath isEqual:self.expandingIndexPath]) {
                self.expandingIndexPath = nil;
                self.expandedIndexPath = nil;
            }
                // add the expanded cell
            else {
                self.expandingIndexPath = indexPath;
                self.expandedIndexPath = [NSIndexPath indexPathForRow:[indexPath row] + 1
                                                            inSection:[indexPath section]];
            }
        
            [tableView beginUpdates];
        
            if (theExpandedIndexPath) {
                [_theTableView deleteRowsAtIndexPaths:@[theExpandedIndexPath]
                                     withRowAnimation:UITableViewRowAnimationNone];
            }
            if (self.expandedIndexPath) {
                [_theTableView insertRowsAtIndexPaths:@[self.expandedIndexPath]
                                     withRowAnimation:UITableViewRowAnimationNone];
            }
        
            [tableView endUpdates];
        
                // scroll to the expanded cell
            [self.theTableView scrollToRowAtIndexPath:indexPath
                                     atScrollPosition:UITableViewScrollPositionMiddle
                                             animated:YES];
        
        }
        

        【讨论】:

          猜你喜欢
          • 2016-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-14
          相关资源
          最近更新 更多