通过segue传递数据


70

我正在用tableview控制器和detailView做一个简单的iOS应用程序。我想要的只是通过segue传递数据。

这就是它的样子

这就是它的样子。

我想要的就是您单击“Markíza”将打开URL视频1,如果您单击“ TV JOJ”将打开URL视频2在播放器中。

我的tableview单元格:

    struct Program {
        let category : String
        let name : String
    }


   var programy = [Program]()
        self.programy = [Program(category: "Slovenské", name: "Markíza"),
                         Program(category: "Slovenské", name: "TV JOJ")]

Answers:


139

Swift的工作方式与Obj-C完全相同,但是以新语言进行了改编。我从您的帖子中获得的信息不多,但是让我们给每个TableViewController命名以帮助我进行解释。

HomeTableViewController(这是您上面的屏幕截图)

PlayerTableViewController(这是您要转到的播放器屏幕)

如此说来,在PlayerTableViewController中,您需要一个变量来存储传递的数据。在类声明的下面,有类似以下内容(如果您打算将结构存储为单个对象而不是数组:

class PlayerTableViewController: UITableViewController {

    var programVar : Program?

    //the rest of the class methods....

之后,您可以通过两种方式将数据发送到新的TableViewController。

1)使用prepareForSegue

在HomeTableViewController的底部,您将使用prepareForSegue方法传递数据。这是您将使用的代码示例:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    // Create a variable that you want to send
    var newProgramVar = Program(category: "Some", name: "Text")

    // Create a new variable to store the instance of PlayerTableViewController 
    let destinationVC = segue.destinationViewController as PlayerTableViewController
    destinationVC.programVar = newProgramVar
    }
}

一旦PlayerTableViewController加载,变量将已经设置并可用

2)使用didSelectRowAtIndexPath

如果需要根据选择的单元格发送特定数据,则可以使用didSelectRowAtIndexPath。为此,您需要在情节提要视图中为segue命名(如果您也需要知道如何操作,请告诉我)。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    // Create a variable that you want to send based on the destination view controller 
    // You can get a reference to the data by using indexPath shown below
    let selectedProgram = programy[indexPath.row]

    // Create an instance of PlayerTableViewController and pass the variable
    let destinationVC = PlayerTableViewController()
    destinationVC.programVar = selectedProgram

    // Let's assume that the segue name is called playerSegue
    // This will perform the segue and pre-load the variable for you to use
    destinationVC.performSegueWithIdentifier("playerSegue", sender: self)
}

让我知道您是否需要其他任何信息


萨沙。检查我的答案。我要喜欢 如果将单击CELL1,它将打开链接1,如果将单击CELL2,将打开链接2
patrikbelis 2014年

5
我尝试了2)方法,但总是收到一个异常,告诉我“ Receiver PlayerTableViewController没有标识符为'playerSegue'的segue”。只是调用performSegueWithIdentifier可以正常工作,但随后没有数据传输到新视图。:[
althaus 2014年

2
@althaus @SashaReid不是更好地使用indexPathForSelectedRow而不是didSelectRowAtIndexPath回调吗?例子:destinationVC.programVar = products[self.tableView.indexPathForSelectedRow!.row]prepareForSegue方法上。让我知道我是否错了(我也是新手)。
Paulo Henrique Nonaka

29
@SashaReid我遇到的问题与上一则评论中提到的替代问题相同。我正在尝试做第二种方法,有些困惑。在示例中,segue从HomeTableVC转到PlayerTableVC,那么为什么要使用destinationVC.performSegueWithIdentifier(“ playerSegue”,sender:self)?当前的VC是不是正在执行segue的那个?
FortuneFaded

2
我认为最后一个调用.performSegueWithIdentifier()的行应在self而不是destinationVc上调用
Herno 19'Jan

51

使用Swift 3和4

在第一个ViewController中(发送值)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "MainToTimer") {
        let vc = segue.destination as! YourViewController
        vc.verificationId = "Your Data"
    }
}

在第二个viewController中(捕获值)

var verificationId = String()

1
var var_name = String()-在第二个viewcontroller中使用它来捕获值
DragonFire

4

如果您不需要通过标识符来识别操作,而仅通过目标类来识别...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? YourViewController {
        vc.var_name = "Your Data"
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.