【问题标题】:Swift: Make button trigger segue to new scene斯威夫特:使按钮触发segue到新场景
【发布时间】:2014-09-28 19:55:35
【问题描述】:

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

我知道如何创建链接到按钮的IBAction,但我会在IBAction 中添加什么?

我是初学者,所以我需要在这里一步一步地解释。我已经包含了我的故事板的图片。我还没有写任何代码。

【问题讨论】:

    标签: ios swift xcode6


    【解决方案1】:

    如果你想让一个按钮触发 segue 转换,最简单的方法是 Control+Click 从按钮到视图控制器,然后选择一个 Segue 选项(如推送)。这将在 IB 中为您连接起来。

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

    V2

    @IBAction func about(sender: AnyObject) {
        performSegueWithIdentifier("about", sender: sender)
    }
    

    V3

    @IBAction func about(_ sender: Any) {
        performSegue(withIdentifier: "about", sender: sender)
    }
    

    【讨论】:

    • 好吧,我点击了控件,现在当我点击按钮时,应用程序在 AppDelegate 的第一行崩溃并显示“SIGABRT”
    • 我觉得应该是self.performSegueWithIdentifier("about", sender: sender)
    【解决方案2】:

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

    这个想法是让单元格通知表格视图控制器点击该按钮,传递有关(显示的数据)行的相关数据。然后表格视图控制器启动一个 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 属性才能使其正常工作。如上所述,如果它的作用是显示有关行的详细信息,您可以将所有必需的数据嵌入到您的 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
        }
    }
    

    【讨论】:

    • 感谢安东尼奥这个很好的例子。我也开始迅速。您是否认为使用普通视图(而不是 tableView)制作相同的东西很复杂?以及传递数据。
    • @NoX 是的,绝对的。我经常创建可以重用的视图,或者只是将复杂的 UI 分解成更易于理解的部分,并且在几乎所有情况下,我都使用委托模式将用户交互转发到包含视图控制器(或视图)
    【解决方案3】:

    在您的事件下使用self.performSegueWithIdentifier("yourViewSegue", sender: sender) 来处理按钮的点击:

    @IBAction func redButtonClicked(sender: AnyObject) {
        self.performSegueWithIdentifier("redView", sender: sender)
    }
    

    在上面的代码中,redView 是 segue 标识符。

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2017-11-13
      • 2015-08-19
      相关资源
      最近更新 更多