TableView的accessoryButtonTappedForRow方法执行的时机

敲代码时遇到了这个问题,别偷懒,写下来备查.

当你在IB中对TableView中的accessory(注意,我说的是cell中的accessory,而不是cell)创建segue时,如果你在VC中同时实现以下4个方法,请问调用的次序是神马!?

//1
func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath)

//2
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool

//3
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

//4
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

答案是:2,1,3!对你没看错,最后一个根本不会调用!

如果你使用shouldPerformSegue,那么你在该方法里是无法取到segue本身的,你必须配合prepare方法才可以.

如果你需要在prepare方法里取得被按下accessory对应的cell的索引,那么你不可以使用tableView.indexPathForSelectedRow,因为你segue绑定的是cell的accessory而不是cell,所以你取得的返回值是nil.

要想解决以上问题非常简单prepare第二个参数sender就是了:

let cell = sender as! UITableViewCell
let selectedRow = tableView.indexPath(for: cell)!.row

如果你是自定义cell的accessory按钮,那么你可能回用得着下面这个方法:

tableView.indexPathForRow(at: point)

下面是等效的objC的代码,留个念想:

NSSet *touches = [event allTouches];  
UITouch *touch = [touches anyObject];  
CGPoint currentTouchPosition = [touch locationInView:self.contactsTableView];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
使用 JavaFX 的 TableView 控件,你可以按照以下步骤进行操作: 1. 导入必要的 JavaFX 类: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; ``` 2. 创建 TableView 和相关的 TableColumn 对象: ```java TableView<YourDataClass> tableView = new TableView<>(); TableColumn<YourDataClass, String> column1 = new TableColumn<>("Column 1"); TableColumn<YourDataClass, Integer> column2 = new TableColumn<>("Column 2"); // ... ``` 3. 设置 TableView 的数据源(items): ```java ObservableList<YourDataClass> dataList = FXCollections.observableArrayList(); // 添加数据到 dataList tableView.setItems(dataList); ``` 4. 设置 TableColumn 的单元格值提供器(CellValueFactory): ```java column1.setCellValueFactory(new PropertyValueFactory<>("property1")); column2.setCellValueFactory(new PropertyValueFactory<>("property2")); // ... ``` 其中,"property1" 和 "property2" 是 YourDataClass 中的属性名称,用于获取对应列的数据。 5. 可选:设置 TableColumn 的单元格工厂(CellFactory)来自定义单元格的显示方式。 6. 将 TableColumn 添加到 TableView 中: ```java tableView.getColumns().add(column1); tableView.getColumns().add(column2); // ... ``` 7. 创建 Scene 并将 TableView 放入其中: ```java Scene scene = new Scene(tableView); ``` 8. 创建 Stage 并设置 Scene: ```java Stage stage = new Stage(); stage.setScene(scene); stage.show(); ``` 通过以上步骤,你就可以创建一个基本的 TableView,并在其中显示和操作表格数据了。你可以根据自己的需求,进一步设置 TableView 的其他属性和方法,以满足更复杂的功能要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值