Swift:以编程方式枚举来自 UIVIewController 的传出转场

Swift: programmatically enumerate outgoing segues from a UIVIewController

我想列出来自 UIViewController 的传出转场,如 Programmatically enumerate outgoing Segues for a UIViewController 中所述,但在 Swift 中。 (Swift 2, Xcode 7, iOS8+).

我可以

override func viewDidLoad() {
    super.viewDidLoad()
    let s = valueForKey("storyboardSegueTemplates")
    print("switchingVC: segues: \(s)") 
}

并产生类似

的输出
switchingVC: segues: Optional((
    "<UIStoryboardPresentationSegueTemplate: 0x1754a130>",
    "<UIStoryboardPresentationSegueTemplate: 0x17534f60>",
    "<UIStoryboardPresentationSegueTemplate: 0x17534fc0>"
))

但在那之后我很难做出任何东西。我找不到 UIStoryboardPresentationSegueTemplate 的任何定义。我怎样才能说服 Swift 告诉我里面有什么?我怎样才能找到 segue identifier?

谢谢!

这个 valueForKey("storyboardSegueTemplates")UNDOCUMENTED 属性 并且 UIStoryboardPresentationSegueTemplateUNDOCUMENTED class.如果您正在将应用程序上传到 App Store,请注意被 App Store 拒绝。

如果您想在您的 in-house 项目中使用它,请按以下方式使用

for template in (valueForKey("storyboardSegueTemplates") as? [AnyObject])! {
    if let identifier = template.valueForKey("identifier") as? String {
        print("identifier - " + identifier)
    }
    else {
        print("no identifier for \(template)")
    }
}

来自 https://github.com/JaviSoto/iOS9-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIStoryboardSegueTemplate.h

根据 Swift 4.2 和 。谢谢/johnykutty.

import UIKit

extension UIViewController {

     // Segue aids in Swift
     @objc func isValidSegue(_ segueId: String?) -> Bool {
        let filteredArray = (value(forKey: "storyboardSegueTemplates") as? NSArray)?.filtered(using: NSPredicate(format: "identifier = %@", segueId ?? ""))
        let isValid = (filteredArray?.count ?? 0) > 0
        return isValid
     }

     @objc func segues() -> Array<Any>? {
        let segues = self.value(forKey: "storyboardSegueTemplates")
        return segues as! Array<Any>?
     }

    @objc func segueNames() -> Array<AnyHashable> {
        var segueNames = Array<Any>()

        let filteredArray = (value(forKey: "storyboardSegueTemplates") as? NSArray)?.filtered(using: NSPredicate(format: "identifier != nil" ))

        for template in filteredArray! as [AnyObject] {
           if let identifier = (template.value(forKey: "identifier") as? String) {
               segueNames.append(identifier)
            }
            else {
                segueNames.append("no identifier for \(template)")
            }
        }

        return segueNames as! Array<AnyHashable>
    }
}

我知道我对谓词的使用可能会更好,但是 Swift 在处理迭代数组时就是这样的 PITA。请随时改进。