Swift: 以编程方式枚举UIViewController的传出连线

4
我想列出一个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

谢谢!

2个回答

3

这个valueForKey("storyboardSegueTemplates")是一个未记录的属性,UIStoryboardPresentationSegueTemplate是一个未记录的类。如果您将应用程序上传到App Store,注意可能会被拒绝。

如果您想在公司内部项目中使用它,请按以下方式使用

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


太好了!这个可行,非常感谢,特别是给的 Github 链接。 - emrys57
可能会起作用,但要注意应用商店的审批过程。 - Johnykutty

0
根据Swift 4.2和https://dev59.com/oZPfa4cB1Zd3GeqPD3-X#35060917。谢谢/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真的很让人头疼。请随意改进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接