Swift:使按钮触发segue到新场景

sky*_*guy 21 ios swift xcode6

好吧,所以我有一个TableView场景,我要在每个单元格中放一个按钮,我需要每个单元格,当点击时,segue到它自己的ViewController场景.换句话说,我需要知道如何将按钮连接到场景(我现在唯一的按钮是"牛奶")

我知道如何创建一个IBAction链接到一个按钮,但我会把它放在什么IBAction

我是初学者,所以我需要在这里逐步解释.我已经包含了我的故事板的图片.我还没有编写任何代码.在此输入图像描述

AlB*_*lue 34

如果你想让一个按钮触发segue过渡,最简单的方法是从按钮到视图控制器的Control + Click并选择一个Segue选项(如push).这将把它连接到IB中.

如果您想手动编写代码来执行此操作,可以通过命名segue来实现(有一个标识符选项,您可以在创建它之后设置它) - 您仍然需要在IB之前创建segue它)然后你可以用这个代码触发它:

V2

@IBAction func about(sender: AnyObject) {
    performSegueWithIdentifier("about", sender: sender)
}
Run Code Online (Sandbox Code Playgroud)

V3

@IBAction func about(_ sender: Any) {
    performSegue(withIdentifier: "about", sender: sender)
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 16

您可以使用委派模式.假设您已经实现了一个自定义表格单元格,您可以在其类中定义一个属性来保存您认为有助于识别行的任何内容 - 它可以是其索引,或者(我的首选方式)表示类的实例单元格中显示的数据(我正在调用它MyCellData.

我们的想法是让单元通知表视图控制器关于该按钮的点击,传递关于该行(显示在其中的数据)的相关数据.然后,表视图控制器启动一个segue,并在重写prepareForSegue方法中将单元传递的数据存储到目标控制器.这样,如果您必须显示有关该行的详细信息数据,您将拥有所有相关信息,例如详细信息数据本身,或目标视图控制器可用于检索数据的标识符,例如从本地数据库或远程服务检索数据.

定义协议:

protocol MyCellDelegate {
    func didTapMilk(data: MyCellData)
}
Run Code Online (Sandbox Code Playgroud)

然后声明delegate在单元类中命名的属性,并didTapMilk从IBAction 调用其方法

class MyTableCell : UITableViewCell {
    var delegate: MyCellDelegate?
    var data: MyCellData!

    @IBAction func didTapMilk() {
        if let delegate = self.delegate {
            delegate.didTapMilk(self.data)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,在表视图控制器中实现协议,并覆盖 prepareForSegue

extension MyTableViewController : MyCellDelegate {
    func didTapMilk(data: MyCellData) {
        performSegueWithIdentifier("mySegueId", sender: data)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "mySegueId" {
            let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
            vc.data = sender as? MyCellData
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要data在目标视图控制器上使用属性才能使用该属性.如上所述,如果它显示有关行的详细信息,您可以将所有必需的数据嵌入到您的MyCellData类中 - 或者至少是从任何源(例如本地数据库,远程服务等)检索数据所需的数据).

最后,在cellForRowAtIndexPath中,将数据存储在单元格中并将其delegate属性设置为self:

extension MyTableViewController : UITableViewDataSource {
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
        let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
        cell.data = data
        cell.delegate = self

        // ... other initializations

        return cell
    }
}
Run Code Online (Sandbox Code Playgroud)