在Swift准备Segue

时间:2014-06-04 14:49:10

标签: ios swift uistoryboard uistoryboardsegue

我正面临错误消息:

"UIStoryboardSegue does not have a member named 'identifier'"

这是导致错误的代码

if (segue.identifier == "Load View") {
    // pass data to next view
}

在Obj-C上使用这样很好:

if ([segue.identifier isEqualToString:@"Load View"]) {
   // pass data to next view
}

我做错了什么?

10 个答案:

答案 0 :(得分:94)

这似乎是由UITableViewController子类模板中的问题引起的。它附带了prepareForSegue方法的一个版本,需要您打开segue。

将当前prepareForSegue功能替换为:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "Load View") {
        // pass data to next view
    }
}

这个版本隐含地展开参数,所以你应该没问题。

答案 1 :(得分:36)

我认为问题是你必须使用!解开标识符

我有

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if segue!.identifier == "Details" {
            let viewController:ViewController = segue!.destinationViewController as ViewController
            let indexPath = self.tableView.indexPathForSelectedRow()
            viewController.pinCode = self.exams[indexPath.row]

        }

    }

我的理解是没有!你得到一个真或假的价值

答案 2 :(得分:35)

Swift 4,Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "MySegueId" {
        if let nextViewController = segue.destination as? NextViewController {
                nextViewController.valueOfxyz = "XYZ" //Or pass any values
                nextViewController.valueOf123 = 123
        }
    }
}

答案 3 :(得分:10)

Swift 1.2

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
            if (segue.identifier == "ShowDeal") {

                if let viewController: DealLandingViewController = segue.destinationViewController as? DealLandingViewController {
                    viewController.dealEntry = deal
                }

            }
     }

答案 4 :(得分:10)

对于Swift 2.3,swift3和swift4:

在didSelectRowAtindexPath创建一个执行Segue

对于Ex:

   self.performSegue(withIdentifier: "uiView", sender: self)

之后创建一个prepareforSegue函数来捕获Destination segue并传递值:

例如:

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       if segue.identifier == "uiView"{

        let destView = segue.destination as! WebViewController
        let indexpath = self.newsTableView.indexPathForSelectedRow
        let indexurl = tableDatalist[(indexpath?.row)!].link
        destView.UrlRec = indexurl

        //let url =

    }
    }

您需要在Destination ViewController

中创建名为UrlRec的变量

答案 5 :(得分:2)

在Swift 4.2和Swift 5中为Segue做准备。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "OrderVC") {
        // pass data to next view
        let viewController = segue.destination as? MyOrderDetailsVC
        viewController!.OrderData = self.MyorderArray[selectedIndex]


    }
}

如何在特定事件上调用segue(如单击按钮等):

performSegue(withIdentifier: "OrderVC", sender: self)

答案 6 :(得分:1)

这是您可以使用此功能的方法之一,当您想要访问另一个类的变量并根据该变量更改输出时。

   override func prepare(for segue: UIStoryboardSegue, sender: Any?)  {
        let something = segue.destination as! someViewController
       something.aVariable = anotherVariable
   }

答案 7 :(得分:0)

如果您没有使用具有不同标识符的相同目标视图控制器,则代码可以比其他解决方案更简洁(并避免在其他一些答案中使用as!):

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    if let myViewController = segue.destinationController as? MyViewController { 
        // Set up the VC
    }
}

答案 8 :(得分:-1)

在带有id的部分的右侧面板中更改segue标识符。用于匹配条件中使用的字符串的图标。

答案 9 :(得分:-3)

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
        if(segue!.identifier){
            var name = segue!.identifier;
            if (name.compare("Load View") == 0){

            }
        }
    }

您无法将标识符与==进行比较,您必须使用compare()方法