ios - 将变量分配给传入视图控制器的正确方法
问题描述
我正在开发一个简单的主从应用程序,它使用许多表单作为模式。
详细 ViewController 是一个 TableViewController,每个单元格中都有编辑按钮。
我想找到一种方法,在单击编辑按钮时将单元格的对象分配给传入的表单,以便表单可以显示正确的数据,但我不确定我是否做得正确方法...
我@IBAction
对编辑按钮使用了如下:
// DetailViewController.swift
var activeBooking: Booking? = nil
@IBAction func onEditBooking(_ sender: Any) {
let button = sender as! UIButton
let cell = button.superview!.superview as! BookingCell
self.activeBooking = cell.booking!
}
然后在我的prepare(for segue:)
方法中,我有以下内容:
// DetailViewController.swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier === "editBookingSegue" {
let controller = segue.destination as! EditRoomViewController
controller.booking = activeBooking
}
}
问题1
这样可以吗?我知道通过 segue 传递数据是合法的,并且它有效,但我担心这两种方法的执行顺序,是否会出现竞争条件,在操作中进行分配prepare
之前可以调用 segue 方法?activeBooking
问题 2
另外,我不喜欢使用button.superview!.superview
- 看起来很乱。有没有更简单的方法来遍历TableViewCell
按下的按钮?我想另一种选择是在这种情况下我可以通过子类化来简化它,UIButton
以便booking
对象也可以直接存储在按钮上。
解决方案
让单元完全拥有按钮并使用委托方法将操作传递给您的视图控制器。您的视图控制器不需要知道按钮。让按钮调用其单元格上的方法。然后该单元将预订请求报告给它的代表。
//myCell.swift
@IBAction func onEditBooking(_ sender: Any) {
bookingDelegate.edit(booking: self.booking)
}
// DetailViewController.swift
func edit(booking: Booking) {
activeBooking = booking
performSegue(withIdentifier: "editBookingSegue", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "editBookingSegue" {
let controller = segue.destination as! EditRoomViewController
controller.booking = activeBooking
}
或者更好的方法是使用 prepare for segue 方法中的 sender 值来确定按下了哪个按钮。给它分配一个标签或其他东西。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "editBookingSegue" {
let button = sender as! UIButton
let booking = bookingsArray[button.tag]
let controller = segue.destination as! EditRoomViewController
controller.booking = booking
}
推荐阅读
- php - password_verify 始终返回 true
- nginx - 两个反向代理后面的气流 - 图 GET 请求不包含任何 DAG ID
- c++ - TTF_RenderText_Blend() 生成的奇怪的文本阴影?
- android - 媒体不允许主目录下载
- r - 如何在条形图中按月汇总数据总和?
- python-3.x - 通过 pip 安装 vowpalwabbit 会出现错误“目标模式不包含 % ... 目标配方失败”
- python-3.x - 消息框后的entry_focus怎么做
- python-3.x - Python 类继承 - 均值,错误:未定义均值
- c# - 如何将csv文件读入列表
- > 使用 CSVHelper
- airflow - 使用 Logstash 解析嵌套的 Apache Airflow 日志行