首页 > 解决方案 > 将变量分配给传入视图控制器的正确方法

问题描述

我正在开发一个简单的主从应用程序,它使用许多表单作为模式。

详细 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对象也可以直接存储在按钮上。

标签: iosswift

解决方案


让单元完全拥有按钮并使用委托方法将操作传递给您的视图控制器。您的视图控制器不需要知道按钮。让按钮调用其单元格上的方法。然后该单元将预订请求报告给它的代表。

//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
}

推荐阅读