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 属性 并且 UIStoryboardPresentationSegueTemplate
是 UNDOCUMENTED 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)")
}
}
根据 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。请随时改进。
我想列出来自 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 属性 并且 UIStoryboardPresentationSegueTemplate
是 UNDOCUMENTED 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)")
}
}
根据 Swift 4.2 和
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。请随时改进。