如何在不使用 iOS 中的 UITableViewDelegate 方法的情况下获取选择的 UITableViewCell

Posted

技术标签:

【中文标题】如何在不使用 iOS 中的 UITableViewDelegate 方法的情况下获取选择的 UITableViewCell【英文标题】:How to get which UITableViewCell selected without using UITableViewDelegate methods in iOS 【发布时间】:2015-04-08 06:23:55 【问题描述】:

我想知道如何在选择单元格时获取选定单元格的行索引。但是如何在不使用UITableViewDelegate 方法的情况下做到这一点。 请告诉我。 我有很多搜索但没有得到解决方案,所以如果有人知道请告诉我。 请分享有关它的观点。

在此先感谢...!!!

【问题讨论】:

不,我已经搜索过你提到的链接 您不想使用代表的原因是什么?这是最简单的方法。您的意图可能会帮助我们为您提供更好的解决方案。 其实这个问题是面试官问我的 已回答...希望它具有解释性和帮助性:) 谢谢Mayur ...!!! 【参考方案1】:

在这种情况下,您的面试官想知道您如何自己实施委托...

为此,创建一个从UITableViewCell 扩展的自定义类“YourTableViewCell”,并使用该类对象在-tableView:cellForRowAtIndexPath: 中返回

用方法写一个协议“CellSelectionProtocol”-

-(void) cellSelected: (YourTableViewCell *) cell;

现在将此协议委托给拥有 TableView 的 ViewController 并定义方法的实现如下 -

-(void) cellSelected: (YourTableViewCell *) cell

    NSIndexPath *selectedIndexPath = [_yourTableView indexPathForCell: cell];

如果是面试,我的回答是这样,我很确定它会被接受。

但是对于一个好的架构...协议和委托实现应该分为两个级别,例如 ->

YourTableViewCell -> delegates -cellSelected: -> YourTableView -> delegates -tableView:didSelectRowAtIndexPath: -> YourViewController

请参阅:您的面试官只是想知道您如何手动创建委托,而不是使用默认的 UITableViewDelegates。

编辑 @Unheilig

我的意思是分 2 个级别,因为 UITableViewCell 的选择必须委托给 UITableView 而不是直接委托给控制器,原因如下

UITableViewCellUITableView 的子视图 一个控制器中可以有多个UITableView。因此,如果您直接委托单元格选择,您将如何告诉控制器单元格是为哪个 UITableView 对象选择的? 另外UITableView 可能必须与其他UITableViewCell 进行其他处理,例如如果选中并更改背景颜色,则应取消选择先前选择并获取默认背景颜色。或者,如果启用了多选,则添加到所选单元格的数组中。

有许多类似的架构必需品让我说 - “但是对于一个好的架构......协议和委托实现应该分为两个层次,比如 ->”

我希望这现在可以很好地解释......

【讨论】:

谢谢Mayer...我想这是他对我的期望。 能否给我代码表单为 UITableView 自定义委托。 查看这个以获得更好的解释和实施...有比我更好的专家向核心解释...tutorialspoint.com/ios/ios_delegates.htm另请查看文档developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… 我已经准备好看到这些链接,但我想知道 UITableView 如何做到这一点。请给我一些代表 tableview 的代码 @MayurDeshmukh 您能否详细说明/解释一下“但是对于一个好的架构......协议和委托实现应该分为两个级别”?两个级别是什么意思?【参考方案2】:

如果不使用 tableview 委托方法,则无法获取选定的单元格行索引。

当你点击 tableview 时,didSelectRowAtIndexPath 被调用并获取 tableview 单元格索引。

有一种方法可以做到这一点,但获取 tableview 单元格索引的过程不正确。在 tableviewcell 上创建一个按钮,并将 indexvalue 作为发送者标签传递给按钮操作。但只需要点击那个按钮。

答案已编辑:


在 cellForRowAtIndexPath 方法中在 tableview 单元格上创建一个透明按钮,并将单元格索引传递给按钮标签。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height);
    button.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    button.tag = indexPath.row;
    [cell addSubview:button];

    cell.textLabel.text = [NSString stringWithFormat:@"%@",[numberArray objectAtIndex:indexPath.row]];

    return cell;


-(void)buttonClicked:(id)sender

    NSLog(@"%ld",(long)[sender tag]);


【讨论】:

本题为面试题。一位面试官问我这个问题。 好的。据我所知,没有办法。尝试在 UITableviewCell 上创建透明按钮。从 cellForRowAtIndexPath 方法将索引值传递给按钮操作。 但是如果有 1000 个单元格,那该怎么做...?? 在 cellForRowIndexPath 方法中创建一个按钮。对于此方法调用的每个单元格。给我一些时间,我会检查并通知你。 已回答..检查代码..但严格来说这是一个糟糕的过程

以上是关于如何在不使用 iOS 中的 UITableViewDelegate 方法的情况下获取选择的 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

如何以普通样式隐藏在 UITableView 中显示的空 UITableViewCells - IOS?

如何在不使用 Api 的情况下在 uitableview 中进行分页?

如何在iOS中的UITableView的最后一行添加一行字符串?

如何减少/删除分组 UITableView 中的左/右手边距?

如何在 swift iOS 中的 UIAlertcontroller 中显示 UITableview?

如何根据ios 8中的内容动态调整UITableview Header高度