Swift:使button触发继续到新的场景
好了,所以我有一个TableView
场景,我将在每个单元格中放置一个button,并且我需要每个单元格在单击时切换到它自己的ViewController
场景。 换句话说,我需要知道如何将一个button连接到一个场景(我现在唯一的button是“牛奶”)
我知道如何创build一个IBAction
链接到一个button,但我会在IBAction
?
我是初学者,所以我需要一步一步的解释。 我已经包括了我的故事板的图片。 我还没有写任何代码。
如果你想有一个button触发segue转换,最简单的事情就是控制+点击从button到视图控制器,并selectSegue选项(如推)。 这将在IB为您连接。
如果你想自己手动编写代码来完成这个工作,你可以通过命名segue来完成(有一个标识符选项,你可以在创build它之后进行设置 – 你仍然需要在IB中创buildsegue,然后才能做它),然后你可以用这个代码来触发它:
V2
@IBAction func about(sender: AnyObject) { performSegueWithIdentifier("about", sender: sender) }
V3
@IBAction func about(_ sender: Any) { performSegue(withIdentifier: "about", sender: sender) }
您可以使用委托模式 。 假定你已经实现了一个自定义表格单元格,你可以在它的类中定义一个属性来保存你认为有助于识别行的任何东西 – 它可以是它的索引,或者(我喜欢的方式)一个类的实例,数据显示在单元格(我叫它MyCellData
。
这个想法是让单元通知表格视图控制器关于该button的一个轻击,传递关于该行中显示的数据的相关数据。 表视图控制器然后启动一个segue,并在重写的prepareForSegue
方法中,它将单元格传递的数据存储到目标控制器。 这样,如果必须显示关于该行的详细信息,则可以获取所有相关信息,例如详细信息数据本身,或目标视图控制器可用于从本地数据库或远程服务中检索数据的标识符。
定义一个协议:
protocol MyCellDelegate { func didTapMilk(data: MyCellData) }
然后在cell类中声明一个名为delegate
的属性,并从IBAction中调用它的didTapMilk
方法
class MyTableCell : UITableViewCell { var delegate: MyCellDelegate? var data: MyCellData! @IBAction func didTapMilk() { if let delegate = self.delegate { delegate.didTapMilk(self.data) } } }
接下来,在您的表视图控制器中实现协议,同时覆盖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 } } }
当然,你需要在你的目标视图控制器上的data
属性来工作。 如上所述,如果它显示有关该行的详细信息,则可以将所有必需的数据embedded到MyCellData
类中 – 或者至less需要从任何来源(如本地数据库,远程服务,等等。)。
最后,在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 } }
在你的事件下使用self.performSegueWithIdentifier("yourViewSegue", sender: sender)
来处理button的点击:
@IBAction func redButtonClicked(sender: AnyObject) { self.performSegueWithIdentifier("redView", sender: sender) }
在上面的代码中, redView
是segue标识符。