为 Swift 中的 Segue 做准备

Posted

技术标签:

【中文标题】为 Swift 中的 Segue 做准备【英文标题】:Prepare for Segue in Swift 【发布时间】:2014-07-25 07:05:37 【问题描述】:

我正面临错误消息:

"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

我做错了什么?

【问题讨论】:

错误是否在UIStoryboardSegue的末尾有问号 请显示您正在使用的整个功能。 【参考方案1】:

这似乎是由于UITableViewController 子类模板中的问题。它带有 prepareForSegue 方法的一个版本,需要您解开 segue。

将您当前的 prepareForSegue 函数替换为:

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

这个版本隐式解包参数,所以你应该没问题。

【讨论】:

@Fogmeister 我注释掉了模板提供的版本并开始输入prepareForSegue,自动完成向我建议了强制解包参数的版本。谁知道...【参考方案2】:

斯威夫特 4、斯威夫特 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】:

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

我有

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]

        

    

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

【讨论】:

不,你没有。标识符是 segue 的强制解包属性。 @Fogmeister 所以使用 Xcode 提供的模板似乎没有展开 是的,看起来子类的模板是错误的。【参考方案4】:

对于 Swift 2.3、swift3 和 swift4:

在 didSelectRowAtindexPath 处创建一个执行 Segue

例如:

   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 =

    
    

您需要在目标视图控制器中创建一个名为 UrlRec 的变量

【讨论】:

【参考方案5】:

斯威夫特 1.2

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

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

            
     

【讨论】:

as 后面的? 是什么意思? @Deekor destinationViewController 是可选的,而 as?如果它是被强制转换的类型,则强制转换一个可选项。因为它是一个 if let,所以我们只在可选项是 DealLandingViewController 时才让赋值发生,否则我们的条件评估为 false。这是 swift 的语言特性。【参考方案6】:

为 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)

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) 
        if(segue!.identifier)
            var name = segue!.identifier;
            if (name.compare("Load View") == 0)

            
        
    

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

【讨论】:

这是一个错误的说法:Swift 中的字符串符合Equatable 协议,并且中缀运算符“==”被覆盖,因此实际上表达式a == ba.isEqual(b). 您正在将字符串与 NSString 进行比较,它们是不同的,无论上述代码如何工作。 string 没有名为 .isEquals 或 .isequalsto 的方法 NSString 和(Swift 的)String 在幕后自动桥接。在操场上亲自尝试一下:let native = "Hello World"; let bridged = native as NSString 现在输入native == bridged(这会产生true)。现在输入bridged.dynamicType.description()(这会产生乱码)和native.dynamicType.description(),这会产生REPL错误,因为String.Type没有响应description()。

以上是关于为 Swift 中的 Segue 做准备的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中为嵌入式 tableView 中的 segue 做准备

为 segue 做准备,传递数据

Segue 为 segue 做准备的特定值

准备 segue 数组时不包含数据(使用 swift)

Swift 3 - 调用准备 segue 时视图不更新

如果 segue.identifier == "showChildFiles" 当 segue 标识符看起来正确时,Swift 3 准备 segue 不通过