Swift: programmatically enumerate outgoing segues from a UIVIewController

后端 未结 2 1581
-上瘾入骨i
-上瘾入骨i 2020-12-19 16:17

I want to list the outgoing segues from a UIViewController, as described in Programmatically enumerate outgoing Segues for a UIViewController, but in Swift. (Swift 2, Xcode

2条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-19 17:09

    As per Swift 4.2 and from https://stackoverflow.com/a/35060917/1058199. Thanks /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? {
            let segues = self.value(forKey: "storyboardSegueTemplates")
            return segues as! Array?
         }
    
        @objc func segueNames() -> Array {
            var segueNames = Array()
    
            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
        }
    }
    

    I know my use of predicates could be better, but Swift is such a PITA when dealing with iterating arrays. Please feel free to improve this.

提交回复
热议问题