我有一个视图控制器数组,各种子类不都是同一个VC。我想过滤包含它们的数组,以识别与我选择的过滤器匹配的数组。
问题是,由于它是各种不同类型的VC被处理为"视图控制器",我无法通过清除属性进行过滤。
有没有一种方法可以定义一个将位于所有视图控制器上的属性,然后按它进行过滤?
一个想法是我可以代种 VC,然后为每个控制器子类子类,这样我就可以将它们全部转换为该类型并检查该参数
这是代码: 但是我想将"标题"换成自定义属性
contentViewControllers = contentControllers()
if self.pushedTitle != nil && self.pushedID != nil, self.pushedPage != nil {
if let i = contentViewControllers.index(where: { $0.title == self.pushedPage }) {
return selectContentViewController(contentViewControllers[i])
}
编辑:VC 初始化更新
let text = TextViewController(textView: TextView.init(frame: UIScreen.main.bounds), pageID: page.pageid, pageTitle: page.title)
let navigationController = UINavigationController(rootViewController: text)
contentList.append(navigationController)
我认为最好的方法是添加一个protocol
,如下所示:
protocol PropertyProtocol {
var customProperty: String { get }
}
然后使您的视图控制器符合PropertyProtocol
class ViewController: UIViewController, PropertyProtocol {
var customProperty: String {
return "My property for view Controller"
}
...
}
然后你只需要做:
let i = contentViewControllers.index(where: { (viewController) -> Bool in
if let viewController = viewController as? PropertyProtocol {
return viewController.customProperty == pushedPage
}
return false
})
当然,命名您的协议比我的情况更具描述性。
由于您已经有一个TextViewController
子类,因此您可以执行以下操作:
let i = contentViewControllers.index(where: { (viewController) -> Bool in
var vc = viewController
if let navVC = viewController as? UINavigationController {
vc = navVC.viewControllers.first!
}
if let textViewController = vc as? TextViewController {
return textViewController.pageID == pushedPage
}
return false
})
最后一个选项,也许你应该选择的选项是在 contentList
- var viewControllerIndexes = [String : Int]()
旁边添加一个新变量,然后在你这样做时:
contentList.append(navigationController)
viewControllerIndexList[page.pageid] = contentList.count - 1
然后,当您需要页面ID的索引时,您不需要搜索,而只需执行let index = viewControllerIndexList["myPageID"]